使用System.IO.FileStream将字节数组保存为图像时无法查看图像

时间:2011-12-12 21:45:31

标签: c# asp.net sql-server image blob

我从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。

1 个答案:

答案 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,不使用全图像大小的内存数组副本分配,也不使用中间文件。