从Access数据库中读取图片到PictureBox

3

我一直在尝试在C# Windows应用程序中的PictureBox中读取作为OLE对象保存在Access数据库中的图片。

下面是执行此操作的代码:

        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;
        }

当我执行上面的代码时,会在以下行抛出“参数无效”的异常:
Bitmap bmp = new Bitmap(ms)

从异常消息中可以明显看出,'ms' 的格式无法被识别。有什么建议可以解决这个问题吗?

5个回答

1

很抱歉我无法给你一个好的答案,但我可以告诉你当我尝试时,我得到了相同的结果。有时跳过字节数组的前78个字节有效,有时则无效。

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


1

在谷歌上搜索AccessHdr。您会找到对AccessHdr.cpp和AccessHdr.h的引用。这些将说明提取没有标头的流所需的内容。


1

你不能那么容易地读取OLE对象。实际上,在数据库中将图片保存为OLE对象是不好的做法。

最好将它们作为BLOB对象或路径和文件名存储在某个位置上。AccessImagine可以处理MS Access和C#的两种情况。你可以从这里下载 - http://access.bukrek.net


0

你可以尝试:

pbPassport.Image = Image.FromStream(ms);

-1

你的字节流出现了某种损坏,因为我尝试了你的确切方法,但是用来填充字节数组的数据来自文件中的PNG数据。

我建议创建两个流,一个来自数据库,另一个来自存储在数据库中的图像源文件。然后逐字节比较它们。如果有任何一个字节不同,那么数据库图像数据就是损坏的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接