Как вернуть SqlFileStream в TransactionScope и использовать другое или альтернативное решение, c # - PullRequest
1 голос
/ 29 июня 2019
public SqlFileStream GetStream(Guid streamedReportId, Guid orgReportId)
{
    string tmpFileName = string.Empty;

    using (var ts = new TransactionScope(TransactionScopeOption.Required, TimeSpan.FromHours(1)))
    {
        using (SqlConnection conn = GetConnection())
        using (SqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();

            cmd.CommandText = @"SELECT p.Person.PathName() AS path, 
                                       GET_FILESTREAM_TRANSACTION_CONTEXT() as txnToken   
                                FROM [dbo].[Persons] p 
                                WHERE p.Id = @Id";

            cmd.Parameters.AddWithValue("@Id", personId);

            using (SqlDataReader reader = cmd.ExecuteReader())
            {
                if (reader.Read())
                {
                    var path = reader.GetString(reader.GetOrdinal("path"));

                    byte[] txnToken = reader.GetSqlBinary(reader.GetOrdinal("txnToken")).Value;

                    Stream sqlFileStream = new SqlFileStream((string)path, txnToken, FileAccess.Read);
                    return sqlFileStream;
                }

                reader.Close();
            }
        }

        ts.Complete();
    }

    return null;
}

Я пытаюсь создать функцию на уровне доступа к данным, которая будет возвращать SqlFileStream. Функция должна вызываться из уровня бизнес-логики. SqlFileStream заключено в TransactionScope и несколько операторов using. Я читал о TransactionScope, что ts.Complete() метод не будет выполнен, если возврат вызывается раньше. Как я могу решить эту проблему. Пожалуйста, помогите с альтернативными решениями.

...