我从ms sql server image字段中提取数据。字节数组就像这样形成
public byte[] saveImageBlob(string number)
{
string strSql = "select pic from emp where number like '" + number + "'";
SqlCommand cmd = new SqlCommand(strSql, conn);
SqlDataReader MyReader = cmd.ExecuteReader();
if (MyReader.Read())
{
byte[] m_MyImage = (byte[])MyReader["pic"];
return m_MyImage;
}
return null;
}
然后我在我的page_load函数中调用数组并将其放在像这样的文件流中
Employee emp = new Employee();
emp.getEmployee(Request.QueryString["user"]);
string file_name = System.AppDomain.CurrentDomain.BaseDirectory + "/img/" + emp.Number.ToString() + ".bmp";
System.IO.FileStream _FileStream = new System.IO.FileStream(file_name, System.IO.FileMode.Create, System.IO.FileAccess.Write);
_FileStream.Write(emp.Picture, 0, emp.Picture.Length);
_FileStream.Close();
employee类什么都不做,只是在page_load和我的db类之间传递数据。
文件以正确的名称保存在正确的位置,大小看起来正确。 但我无法打开它或看到图片。该文件已损坏。
客户端告诉我,sql server中的image字段包含BMP图像。
我有点迷失在这里,有没有人有使用mssql blob的经验?
有什么方法可以看出数据库中的图像/ blob字段是否已损坏?
我在代码中遗漏了哪些内容至关重要?
关于,ssg。
答案 0 :(得分:3)
首先,停止在代码中执行SQL注入。请立即停止,检查整个项目,并用适当的参数替换构建动态SQL的所有事件:
string strSql = "select pic from emp where number like @number";
SqlCommand cmd = new SqlCommand(strSql, conn);
cmd.Parameters.Add ("@number", SqlDbType.Varchar, 8000);
cmd.Parameters["@number"].Value = number;
阅读How Data Access Code Affects Database Performance,了解如何正确使用参数。
其次,使用正确的谓词来定位数据。不需要LIKE
。使用=
:
string strSql = "select pic from emp where number = @number";
现在,您的问题:为什么要保存图像,为什么不直接从数据库中使用图像?有关以高效流方式使用SQL Server BLOB作为媒体存储的示例,请参阅Download and Upload images from SQL Server via ASP.Net MVC,不使用全图像大小的内存数组副本分配,也不使用中间文件。