【问题标题】:Read a picture from Access DB into PictureBox将 Access DB 中的图片读入 PictureBox
【发布时间】:2008-10-20 09:49:09
【问题描述】:

我一直试图在 C# windows 应用程序的 PictureBox 中读取作为 OLE 对象保存在 Access DB 中的图片。

执行此操作的代码如下所示:

        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”的格式无法识别。有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: c# ms-access picturebox


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          你可以试试:

          pbPassport.Image = Image.FromStream(ms);
          

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-30
              • 1970-01-01
              • 2016-04-19
              相关资源
              最近更新 更多