3

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

当我执行上述代码时,会在该行引发“参数无效”异常:

Bitmap bmp = new Bitmap(ms)

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

4

5 回答 5

1

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

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

于 2008-10-20T10:01:30.683 回答
1

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

于 2008-10-20T14:47:51.900 回答
1

您不能如此轻松地读取 OLE 对象。事实上,将图片作为 OLE 对象保存在数据库中是一种不好的做法。

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

于 2009-07-23T12:02:34.543 回答
0

你可以试试:

pbPassport.Image = Image.FromStream(ms);
于 2008-10-20T11:19:14.083 回答
-1

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

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

于 2008-10-20T10:53:13.480 回答