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();