环境:vs2008 ,winForm应用程序,sql2000+sp4数据库。
保存时的语句用存储过程: if(pictureBox1.Image!=null)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
myCommand.Parameters.Add("@photo", SqlDbType.Image);
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
Byte[] bt = new Byte[ms.Length];
ms.Read(bt, 0, (int)ms.Length);
myCommand.Parameters["@photo"].Value = bt;
} }
try
{
myCommand.ExecuteNonQuery();
MessageBox.Show("保存成功.");
this.DialogResult = DialogResult.OK;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
-----------------保存正常,没有问题。
读取时报错,提示参数无效。。 //图片
if (dr["photo"].ToString() != "")
{
try
{
MemoryStream ms = new MemoryStream(dr.GetSqlBinary(0).Value);
Image image = Image.FromStream(ms, true); //此句出错,将true去掉也出错,提示都是参数无效。
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
========请老师们帮忙分析分析,谢谢!!
保存时的语句用存储过程: if(pictureBox1.Image!=null)
{
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
myCommand.Parameters.Add("@photo", SqlDbType.Image);
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
Byte[] bt = new Byte[ms.Length];
ms.Read(bt, 0, (int)ms.Length);
myCommand.Parameters["@photo"].Value = bt;
} }
try
{
myCommand.ExecuteNonQuery();
MessageBox.Show("保存成功.");
this.DialogResult = DialogResult.OK;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
-----------------保存正常,没有问题。
读取时报错,提示参数无效。。 //图片
if (dr["photo"].ToString() != "")
{
try
{
MemoryStream ms = new MemoryStream(dr.GetSqlBinary(0).Value);
Image image = Image.FromStream(ms, true); //此句出错,将true去掉也出错,提示都是参数无效。
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
========请老师们帮忙分析分析,谢谢!!
MemoryStream ms = new MemoryStream(dr.GetSqlBinary(0).Value);调式一下这个值或者输出一下。。看得到的是个什么
修改后提示指定的转换无效。
另外:
先看你你的dr.GetSqlBinary(0).Value值是否对吧是对的,就是photo的值。
输出的值是:System.Byte[]
if (dr["photo"] != DBNull.Value)
{
try
{
byte[] buffer = (byte[])dr["photo"];
MemoryStream ms = new MemoryStream(buffer);
Image image = Image.FromStream(ms);
ms.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
还是提示参数无效。Image image = Image.FromStream(ms);
是不是我存的就有问题呢,数据库字段用Image没问题吧。
修改一:
Byte[] bt = new Byte[ms.Length];
ms.Position = 0;
ms.Read(bt, 0, (int)ms.Length);修改二:
Byte[] bt = ms.ToArray();显然第二种方法简单多了,用MemoryStream自带的方法ToArray就可以获得字节数据。
简单说一下:选对图片进行序列化: private byte[] ConvertByte(Image image)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, (object)image);
ms.Close();
return ms.ToArray();
}///一个小例子`你自己修改一下吧
public bool WhiteImage(PictureBox Pic, string conn)
{
SqlConnection scon = new SqlConnection(conn);
try
{
string sql = "insert into 表(Pic) values(@image_)";
scon.Open();
SqlCommand cmd = new SqlCommand(sql, scon);
cmd.Parameters.Add("@image_", SqlDbType.Image, (int)ConvertByte(Pic.Image).Length);
cmd.Parameters["@image_"].Value = ConvertByte(Pic.Image);
cmd.ExecuteNonQuery();
cmd.Dispose();
scon.Close();
return true;
}
catch (Exception)
{
scon.Close();
return false;
}
}
读取数据时先要将读到的数据反序列化成图片,然后指定给要显示的图片框
private Image ConvertImage(byte[] bytes)
{
MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length);
BinaryFormatter bf = new BinaryFormatter();
object obj = bf.Deserialize(ms);
ms.Close();
return (Image)obj;
}
public void ReadImage(PictureBox Pic, string Conn)
{
string con = Conn;
SqlConnection scon = new SqlConnection(con);
try
{
scon.Open();
string sql = "sql语句"; SqlCommand cmd = new SqlCommand(sql, scon);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
byte[] bytes2 = (byte[])dr["HomePic"];
Pic.Image = ConvertImage(bytes2);
dr.Close();
}
}
catch (Exception)
{
}
finally
{
scon.Close();
}
}
测试通过 没问题
我原先是这样做的
MemoryStream ms = new MemoryStream((byte[])dr.Rows[0]["photo"]);
保存图片: Image image = pictureBox1.Image;
MemoryStream ms = new MemoryStream();
image.Save(ms, ImageFormat.Jpeg); //我这里用的是jpg文件
byte[] buffer = ms.ToArray();
ms.Close();
con.Open();
using (SqlCommand cmd = new SqlCommand(sql, con))
{
cmd.Parameters.Add(new SqlParameter("@photo", buffer));
cmd.ExecuteNonQuery();
}
con.Close();读取图片: DataSet dst = new DataSet();
con.Open();
using (SqlCommand cmd = new SqlCommand(sql, con))
{
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(dst);
}
con.Close(); byte[] buffer = null;
DataRow drow = dst.Tables[0].Rows[0];
if (drow["photo"] != DBNull.Value)
{
buffer = (byte[])drow["photo"];
}
MemoryStream ms = new MemoryStream(buffer);
Image image = Image.FromStream(ms);
ms.Close();
pictureBox1.Image = image;