从Access数据库读取图片
将Image转为byte[]存入Access数据库中的Photo字段(表名staff),这部分操作是正常的,代码如下:
MemoryStream stream=new MemoryStream();
byte[] photo=null;
Image img=this.pictureBox1.Image;
img.Save(stream,ImageFormat.Bmp);
photo=stream.ToArray();
stream.Close();
string sql="Insert into staff (ID,Photo) Values ('001','"+photo+"')";
OleDbCommand comm=new OleDbCommand(sql,conn);
comm.ExecuteNonQuery();
执行这段代码,发现photo的Length为3405534 。
但是从数据库中取数据的时候,执行以下代码,发现photo的Length仅为26 。换成其他图片也一样。请大家帮忙看看,问题出在哪里?
string sql="Select photo From staff Where ID='001'";
OleDbCommand comm=new OleDbCommand(sql,conn);
byte[] photo=(byte[])comm.ExecuteScalar();
也试过Fill到dataSet中,再byte[] photo=(byte[])dataSet.Tables[0].Rows[0]["Photo"];也是一样的结果,只有26字节。我怀疑只有Access数据会出现这样的现象,有空的时候再验证验证。。
请大家帮忙分析下这个问题。。
[解决办法]
string sql="Insert into staff (ID,Photo) Values ('001','"+photo+"')";
这样能插得进去吗?
换成传参数试试
[解决办法]
string sql="Insert into staff (ID,Photo) Values ('001','"+photo+"')";
你用错了!
[解决办法]
private void button4_Click(object sender, EventArgs e) //存图片
{
MemoryStream stream = new MemoryStream();
byte[] photo = null;
Image img = this.pictureBox1.Image;
img.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
photo = stream.ToArray();
stream.Close();
string sql = "Insert into staff (ID,Photo) Values ('001',@img)";
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\d.mdb");
conn.Open();
OleDbCommand comm = new OleDbCommand(sql, conn);
comm.Parameters.Add("@img", OleDbType.VarBinary, photo.Length).Value = photo;
comm.ExecuteNonQuery();
conn.Close();
}
private void button5_Click(object sender, EventArgs e) //取图片
{
string sql = "Select photo From staff Where ID='001'";
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\d.mdb");
conn.Open();
OleDbCommand comm = new OleDbCommand(sql, conn);
OleDbDataReader sdr = comm.ExecuteReader();
sdr.Read();
MemoryStream ms = new MemoryStream((byte[])sdr[0]);
Image image = Image.FromStream(ms);
sdr.Close();
conn.Close();
pictureBox1.Image = image;
}