从c#中的sql中检索图像

时间:2013-02-06 07:03:33

标签: c# sql image

我能够在SQL DB中成功存储图像, 图像的字段为varchar50。 这是我试过的代码

DataTable dt=new DataTable();
dt=neworder.Selectfromimage1();

if (dt.Rows.Count > 0)
{

 // byte[] image =(byte[])dt.Rows[0]["image"];
 byte image=Convert.ToByte(dt.Rows[0]["image"]);
 MemoryStream stream = new MemoryStream(image);
 //stream.Write(image, 0, image.Length);
 stream.Seek(0,

 SeekOrigin.Begin);
 stream.Close();

 btncompanion.Image =

 Image.FromStream(stream);
 }

我收到错误“输入字符串不是正确的格式” 在

byte image=Convert.ToByte(dt.Rows[0]["image"]);

已编辑

保存图片的代码是

private byte[] ImageToStream(string fileName)
{

 MemoryStream stream = new MemoryStream();
 tryagain:

 try
 {

  Bitmap image = new Bitmap(fileName);
  image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);

  // image.Save(stream, System.Drawing.Imaging.ImageFormat.Gif);
 }

 catch (Exception )
 {

  goto tryagain;
 }

 return stream.ToArray();
}
fName ="C:\\Documents and Settings\\KAEM\\My Documents\\My Pictures\\images.jpg";
if (File.Exists(fName))
{

 int id = 2;
 byte[] content = ImageToStream(fName);
 if (neworder.Insertintoimage1(content.ToString()))
 {

}

}

else
{

 MessageBox.Show(fName + " not found ");
}

3 个答案:

答案 0 :(得分:0)

您必须弄清楚如何编码数据以生成varchar字符串。例如,如果它是base64,您将使用Convert.FromBase64String

byte[] image = Convert.FromBase64String(dt.Rows[0]["image"])

现在,由于您是存储图像的人,因此您应该知道它是如何编码的,并且应该能够执行相反的过程来恢复它。

答案 1 :(得分:0)

您将数据库的路径存储在数据库中。 您的代码应如下所示:

string imagePath=dt.Rows[0]["image"].ToString();
            byte[] imageBytes;
            using (FileStream fs = File.Open(imagePath)) {
                 btncompanion.Image = Image.FromStream(fs);
            }

试试这个,未经过测试

答案 2 :(得分:0)

在尝试阅读之前,您正在关闭该流。这不起作用。您应该尝试以下方法:

byte[] image=Convert.ToByte(dt.Rows[0]["image"]);
using (MemoryStream stream = new MemoryStream(image))
{
    btncompanion.Image = Image.FromStream(stream);
}

如果这不起作用并给出GDI +错误,那么这是因为在反序列化图像之前关闭了流。在这种情况下使用:

byte image=Convert.ToByte(dt.Rows[0]["image"]);
MemoryStream stream = new MemoryStream(image);
btncompanion.Image = Image.FromStream(stream);

此外,在存储图像的代码中,您从图像文件中获取字节,但将它们作为string传递给数据库。您是否知道图像字节可以包含从字符串中删除或终止字符串的不可打印字节?

不要将图像存储为字符串,或者至少使用base 64编码。该代码的代码如下:

if (File.Exists(fName))
{
    byte[] content = ImageToStream(fName);
    string contentBase64 = Convert.ToBase64String(content);
    if (neworder.Insertintoimage1(contentBase64))
        ....
}

并检索:

string image = dt.Rows[0]["image"];
byte[] imageBytes = Convert.FromBase64String(image);

MemoryStream stream = new MemoryStream(imageBytes);
btncompanion.Image = Image.FromStream(stream);