我意识到这个问题之前已经被问过并且有答案,但不是以这种特定的方式。我一直在尝试解决这个问题大约 7 个小时。
我有一张图片,我将其转换为字节数组以存储在 Access 数据库 (.mdb) 中
[Image] -> [byte Array] -> [Access Database(field is an OLE object)] ^ 我可以很好地完成这部分,在这里完成:
public byte[] ImageToByte(Image img)
{
Bitmap BmpImage = new Bitmap(img);
BmpImage.Save(Application.StartupPath + @"\unmodified.png", System.Drawing.Imaging.ImageFormat.Png);
MemoryStream mStream = new MemoryStream();
PartPhoto.Image.Save(mStream, System.Drawing.Imaging.ImageFormat.Png);
byte[] imgAsByte = mStream.ToArray();
return imgAsByte;
}
然后我将所有数据存储在我的数据库中,如下所示:
Part p = new Part();
p.PartCode = IPC.Text;
p.PartName = IPN.Text;
p.PartDesc = IDESC.Text;
-->p.PartPhoto = ImageToByte(PartPhoto.Image);
p.PartSize = size;
p.PartWeight = weight;
p.PartType = IPT.Text;
p.LeadTime = ILT.Text;
p.PartCost = ICOST.Text;
p.PartQuantity = IQNT.Text;
d.Insert(p);
Insert 方法执行此操作:
command.CommandText = "Insert INTO PartInfo (PartCode, PartName, PartDesc, PartPhoto, PartSize, PartWeight, PartType, LeadTime, PartCost, PartQuantity) VALUES('" + p.PartCode + "', '" + p.PartName + "', '" + p.PartDesc + "', '@Pic', '" + p.PartSize + "', '" + p.PartWeight + "', '" + p.PartType + "', '" + p.LeadTime + "', '" + p.PartCost + "', '" + p.PartQuantity + "')";
command.Parameters.Add("@Pic", p.PartPhoto);
command.CommandType = CommandType.Text;
connection.Open();
command.ExecuteNonQuery();
它在我的数据库中(在 OLE 对象字段中)显示为长二进制数据。我从数据库中读取到 DataGridView 中,如下所示:
String query = "SELECT * FROM PartInfo WHERE PartName CONTAINS " + "\"" + PN + "\"";
connection.Open();
da.SelectCommand = new OleDbCommand(query, connection);
da.Fill(dt);
然后我打电话给:
PartGrid.DataSource = d.dt;
PartGrid.Refresh();
刷新网格。
这是我的问题。我无法从 DataGridView 中读取字节数组。我尝试了几种不同的方法,总是得到相同的错误:“参数无效”
byte[] picBytes = (byte[])PartGrid.Rows[row].Cells[3].Value;
MemoryStream ms = new MemoryStream(picBytes);
Image partPic = Image.FromStream(ms); //ERROR: "Parameter is not valid"
Bitmap bmp = new Bitmap(partPic);
bmp.Save(Application.StartupPath + @"\test.png", System.Drawing.Imaging.ImageFormat.Png);
return partPic;
我调用从字节数组转换为图像,如下所示:
PartPhoto.Image = ImageFromByte(e.RowIndex);
就像我说的那样,我已经坚持了好几个小时了,而且越来越烦人。