【发布时间】:2017-01-24 11:08:16
【问题描述】:
我正在将文件保存到 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;
}
}
}
}
}
}
当我可以在没有 sql 命令的情况下访问我需要的列时,是否有更简单的方法来执行此操作?
希望我的问题足够清楚,如果没有,请询问,我会详细说明!
更新:
现在的情况是这样的——我有我的存储过程返回的 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();
}
}
干杯, H
【问题讨论】:
-
我建议不要使用
"...WHERE testid = " + selectedValue,因为它不是kosher并导致SQL Injection。而是使用参数,例如"... WHERE testid = @id"和cmd.Parameters.AddWithValue("@id", testid). -
我会修改这个,谢谢。至于我的问题中的更新,您知道可以做什么吗?我想我需要从存储的 blob 中恢复原始文件路径
-
@bjjrolls,blob 列将仅包含您写入的内容。因此,要从数据库中获取文件路径和扩展名,您需要将其存储在那里。我会添加一个单独的列来存储文件名。将问题分解为更小的步骤。首先验证您是否可以通过将 blob 数据 (
byte[]) 保存到文件并将原始文件与从数据库中检索到的结果进行比较来正确地从数据库中读取文件。只有在您确认这一点后,您才能继续在查看器中加载您的文档,问题就变成了“如何使用查看器/库 XYZ”。 -
您是否考虑过使用 SQL Server FileStream 对象,然后您可以像访问文件一样访问数据。建议将 FileStream 用于 1.) 正在存储的对象平均大于 1 MB。 2.) 快速读取访问很重要。 3.) 您正在开发使用中间层作为应用程序逻辑的应用程序。
-
感谢@VladimirBaranov 和 SteveFord 的回复,但我现在使用文件流文件表来存储用户文件,因为它们通常大于 2mb
标签: c# sql .net sql-server blob