将Access DB中的图片读入PictureBox

我一直在尝试将保存在Access DB中的图片作为C#windows应用程序中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; } 

当我执行上面的代码时,行中出现“参数无效”exception:

 Bitmap bmp = new Bitmap(ms) 

从exception消息中可以清楚地看出,’ms’的格式是无法识别的。 有什么建议可以通过这个吗?

你的字节流以某种方式被破坏了,因为我尝试了你的确切方法,但用文件中的PNG数据填充了字节数组。

我建议创建两个流,一个来自数据库,另一个来自文件,该文件是数据库中图像的来源。 然后逐字节比较它们。 如果甚至有一个字节的差异,则数据库图像数据已损坏。

谷歌搜索AccessHdr。 您将找到对AccessHdr.cpp和AccessHdr.h的引用。 这些将说明在没有标题的情况下提取流的需要。

您无法轻松读取OLE对象。 实际上,将图片作为OLE对象保存在数据库中是不好的做法。

在某些存储中,最好将em作为BLOB对象或路径和文件名。 AccessImagine可以处理MS Access和C#的两种情况。 你可以在这里下载 – http://access.bukrek.net

不幸的是,我没有给你很好的答案,但我可以告诉你,当我尝试时,我得到了相同的结果。 有时跳过字节数组的前78个字节,有时它没有。

这是因为OLE Object数据类型在字段中存储了某种类型的标头,因此Access知道它是什么类型的OLE对象。 我找不到一个可靠的方法来确定这个标题停止的位置和实际数据的开始,但我也放弃了,祝你好运:)

你可以试试:

 pbPassport.Image = Image.FromStream(ms);