C# UI - Поток файлового потока SQL Server Исключение SQLDataReader.ExecuteReader() из транзакции не инициализировано?

Я работаю с SQL Server FileStream. Я могу без проблем вставить файлы в свою таблицу, но открыть их - это уже другая история. На данный момент лучшее решение, с которым я столкнулся, - это записать запрашиваемый файл во временную таблицу, а затем открыть его оттуда. Однако я сталкиваюсь с исключением, которое я не могу понять. Код ниже, исключение ниже, заранее спасибо, что нашли время взглянуть на эту проблему.

        string conString = ************
        SqlConnection sqlCon = new SqlConnection(conString);
        sqlCon.Open();

        if (sqlCon.State == ConnectionState.Open)
        {
            SqlTransaction txn = sqlCon.BeginTransaction();
            string queryFileStream = "Select file_stream.PathName(), GET_FILESTREAM_TRANSACTION_CONTEXT(), name from dbo.ImagesTable";
            SqlCommand cmdProjectDatabase = new SqlCommand(queryFileStream, sqlCon);
            SqlDataReader projectReader;
            projectReader = cmdProjectDatabase.ExecuteReader();
            while (projectReader.Read())
            {
                string filePath = projectReader[0].ToString();
                byte[] objContext = (byte[])projectReader[1];
                string fName = projectReader[2].ToString();
                SqlFileStream sfs = new SqlFileStream(filePath, objContext, System.IO.FileAccess.Read);
                byte[] buffer = new byte[(int)sfs.Length];
                sfs.Read(buffer, 0, buffer.Length);
                sfs.Close();

                string filename = "C:\Temp\/" + fName;
                System.IO.FileStream fs = new System.IO.FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Write);
                fs.Write(buffer, 0, buffer.Length);
                fs.Flush();
                fs.Close();
            }
            projectReader.Close();
            txn.Commit();
        }
        else
        {
            MessageBox.Show("Please check connection string.");
        }
        sqlCon.Close();

Линия: projectReader = cmdProjectDatabase.ExecuteReader();

$ exception {"ExecuteReader требует, чтобы у команды была транзакция, когда назначенное команде соединение находится в ожидающей локальной транзакции. Свойство Transaction команды не было инициализировано."} System.InvalidOperationException

Изменить: я изменил такты и теперь у меня есть доступ к данным Filestream, которые я просто застрял, записывая в временную директорию, код ниже:

SqlConnection sqlCon = new SqlConnection(conString);
        sqlCon.Open();

        if (sqlCon.State == ConnectionState.Open)
        {

            SqlCommand cmdProjectDatabase = new SqlCommand("",sqlCon);
            cmdProjectDatabase.CommandText = "Select file_stream.PathName() from dbo.ImagesTable";
            String filePath = null;
            Object pathObj = cmdProjectDatabase.ExecuteScalar();
            if (DBNull.Value != pathObj)
                filePath = (string)pathObj;
            else
            {
                throw new System.Exception(
                    "Chart.PathName() failed"
                  + " to read the path name "
                  + " for the Chart column.");
            }

            SqlTransaction transaction = sqlCon.BeginTransaction("mainTranaction");
            cmdProjectDatabase.Transaction = transaction;

            cmdProjectDatabase.CommandText = "SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()";
            Object obj = cmdProjectDatabase.ExecuteScalar();
            byte[] txContext = (byte[])obj;
            SqlFileStream sqlFileStream = new SqlFileStream(filePath, txContext, FileAccess.ReadWrite);
            byte[] buffer = new byte[512];

            int numBytes = 0;
            string someData = "EKG data.";
            Encoding unicode = Encoding.GetEncoding(0);
            sqlFileStream.Write(unicode.GetBytes(someData.ToCharArray()), 0, someData.Length);
            sqlFileStream.Seek(0L, SeekOrigin.Begin);
            numBytes = sqlFileStream.Read(buffer, 0, buffer.Length);
            string readData = unicode.GetString(buffer);
            if (numBytes != 0)
                Console.WriteLine(readData);
            sqlFileStream.Close();
            //string filename = @"C:\Temp\" + "test";
            //System.IO.FileStream fs = new System.IO.FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Write);
            //fs.Write(buffer, 0, buffer.Length);
            //fs.Flush();
            //fs.Close();

0 ответов

Другие вопросы по тегам