将Access DB中的图片读取到PictureBox中
本文关键字:读取 PictureBox Access DB | 更新日期: 2023-09-27 17:48:48
我一直在尝试读取一张保存在Access DB中的图片,该图片是C#应用程序中PictureBox中的OLE对象。
这样做的代码如下所示:
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:'Rajesh'SampleDB_2003.mdb;";
OleDbConnection oConn = new OleDbConnection(connString);
oConn.Open();
string commandString = "select * from employee where id = " + id + "";
OleDbCommand oCmd = new OleDbCommand(commandString, oConn);
OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess);
while (oReader.Read())
{
txtID.Text = ((int)oReader.GetValue(0)).ToString();
txtName.Text = (string)oReader.GetValue(1);
txtAge.Text = ((int)oReader.GetValue(2)).ToString();
txtType.Text = (string)oReader.GetValue(3);
byte[] imageBytes = (byte[])oReader.GetValue(4);
MemoryStream ms = new MemoryStream();
ms.Write(imageBytes, 0, imageBytes.Length);
Bitmap bmp = new Bitmap(ms);
pbPassport.Image = bmp;
}
当我执行上面的代码时,在以下行抛出"Parameter is not valid"异常:
Bitmap bmp = new Bitmap(ms)
从异常消息中可以清楚地看出,"ms"的格式无法识别。有什么建议吗?
不幸的是,我没有很好的答案,但我可以告诉你,当我尝试时,我得到了相同的结果。有时跳过字节数组的前78个字节有效,有时无效。
这是因为OLE Object数据类型在字段中存储了某种类型的头,这样Access就知道它是什么类型的OLE Object。我找不到一种可靠的方法来准确地计算这个头的停止位置和实际数据的开始位置,但我也放弃了,所以祝你好运:)
在谷歌上搜索AccessHdr。您会发现对AccessHdr.cpp和AccessHdr.h的引用。这些引用将说明提取不带标头的流需要什么。
您无法如此轻松地读取OLE对象。事实上,将图片作为OLE对象保存在数据库中是不好的做法。
在某些存储中,最好将em作为BLOB对象或路径和文件名。AccessImagine可以处理MS Access和C#的两种情况。你可以在这里下载-http://access.bukrek.net
您可以尝试:
pbPassport.Image = Image.FromStream(ms);
您的字节流不知何故已损坏,因为我尝试了您的确切方法,但却用文件中的PNG数据填充了字节数组。
我建议创建两个流,一个来自数据库,另一个来自作为数据库中图像源的文件。然后逐字节比较。如果甚至有一个字节的差异,则数据库映像数据已损坏。