我一直在尝试将保存在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;
        }

当我执行上面的代码时,“参数无效”异常将在以下行中抛出:

Bitmap bmp = new Bitmap(ms)

从异常消息中可以清楚地看到'ms'的格式是无法识别的。有什么建议可以解决这个问题吗?

有帮助吗?

解决方案

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

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

其他提示

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

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

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

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

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

您可以尝试:

pbPassport.Image = Image.FromStream(ms);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top