Я работаю над сохранением файлов в sql blob в столбце varbinary (max), и теперь у меня есть запасная часть вещей, которые я считаю.
Я не могу понять, как читать данные, учитывая, что я извлекаю значения своих БД с помощью хранимой процедуры. Я должен иметь доступ к данным столбца, например ds.Tables [0].Rows [ 0] [ "blobData" ]; поэтому необходимо, чтобы у меня был SQLCommand и т.д., как я видел в примерах, таких как ниже:
private void OpenFile(string selectedValue)
{
String connStr = "...connStr";
fileName = ddlFiles.GetItemText(ddlFiles.SelectedItem);
using (SqlConnection conn = new SqlConnection(connStr))
{
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "SELECT BLOBData FROM BLOBTest WHERE testid = " + selectedValue;
using (SqlDataReader dr = cmd.ExecuteReader())
{
while (dr.Read())
{
int size = 1024 * 1024;
byte[] buffer = new byte[size];
int readBytes = 0;
int index = 0;
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
while ((readBytes = (int)dr.GetBytes(0, index, buffer, 0, size)) > 0)
{
fs.Write(buffer, 0, readBytes);
index += readBytes;
}
}
}
}
}
}
Есть ли более простой способ сделать это, когда я могу получить доступ к столбцу, который мне нужен, без sqlcommand?
Надеюсь, я был достаточно ясен в своем вопросе, если потом не спрошу, и я подробно остановимся!
UPDATE:
Теперь ситуация такова: у меня есть значение столбца blobData, возвращаемого моей хранимой процедурой, и может передать это в поток памяти и вызвать "LoadDocument (memStream); однако это приводит к смехотворному тексту вместо фактического отображения файла.
Теперь у меня вопрос, есть ли способ получить полный путь, включая расширение файла, хранящегося в SQL Blob? В настоящее время я изучаю использование Filetable для этого в надежде, что я смогу получить полный путь.
ОБНОВЛЕНИЕ 2:
Я пробовал создавать временный файл и читать это безрезультатно (все еще тарабарщина)
string fileName = System.IO.Path.GetTempFileName().ToString().Replace(".tmp", fileExt);
using (MemoryStream myMemoryStream = new MemoryStream(blobData, 0, (int)blobData.Length, false, true))
{
using (FileStream myFileStream1 = File.Create(fileName))
{
myMemoryStream.WriteTo(myFileStream1);
myMemoryStream.Flush();
myMemoryStream.Close();
myFileStream1.Flush();
myFileStream1.Close();
FileInfo fi = new FileInfo(fileName);
Process prc = new Process();
prc.StartInfo.FileName = fi.FullName;
prc.Start();
}
}
Cheers, Н