使用 VB.NET 从 Access 中检索长二进制数据(图像)

Posted

技术标签:

【中文标题】使用 VB.NET 从 Access 中检索长二进制数据(图像)【英文标题】:Retrieve Long Binary Data (Image) from Access using VB.NET 【发布时间】:2014-02-24 00:53:36 【问题描述】:

我的代码是

Dim con As New OleDb.OleDbConnection
    Dim dbProvider As String
    Dim dbSource As String

    dbProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
    dbSource = "Data Source=" & My.Settings.bowlingballdatabase



    Dim selectString As String = "Select Picture From BowlingBall WHERE LName = 'Smith'"
    Dim oleConnect As New OleDb.OleDbConnection
    oleConnect.ConnectionString = dbProvider & dbSource
    oleConnect.Open()
    Using oleDBCmd As OleDb.OleDbCommand = oleConnect.CreateCommand()
        oleDBCmd.CommandType = CommandType.Text
        oleDBCmd.CommandText = selectString
        Using oleDbReader As OleDb.OleDbDataReader = oleDBCmd.ExecuteReader()
            oleDbReader.Read()
            Dim ImageBytes As Byte() = CType(oleDbReader(0), Byte())
            Dim ms As New MemoryStream(ImageBytes)
            Dim img As Image = Image.FromStream(ms)
            Me.PictureBox1.Image = img
        End Using
    End Using
    oleConnect.Close()

我认为可能是 SQL 命令的问题?我在以下行收到错误“参数无效”:

Dim img As Image = Image.FromStream(ms)

【问题讨论】:

【参考方案1】:

您的代码本身没有任何问题。您的问题几乎肯定与从 Access 应用程序本身嵌入图像时 Access 存储图像的方式有关。在这些情况下,在将原始图像数据存储在表中之前,会将 OLE“包装器”添加到原始图像数据中。这在处理 Access 中的图像 时可以正常工作,但在处理来自外部应用程序(如 .NET 项目)的图像时可能会导致问题。

您的代码从 Access 数据库中检索 OLE 包装的图像对象,并尝试使用它创建一个 .NET Image 对象。问题是虽然Image 对象可以识别多种图像类型(例如,位图、JPEG 等),但“OLE 包装的图像对象格式”不是其中之一。因此,您需要先从字节流中删除 OLE 包装器,然后再将其传递给Image.FromStream()

有关更多详细信息,请参阅我的另一个答案 here,它显示了如何使用早期答案 here 中的代码“解包”对象。

【讨论】:

感谢戈德。不知道为什么我以前从未批准过。您的链接很有帮助【参考方案2】:

当您执行 oleDbReader(0) 时,您将获得返回的阅读器对象中第一个字段的字段名称。使用 oleDbReader(0)(0) 获取第一列中的第一项,你知道它是怎么回事。

Dim ImageBytes As Byte() = CType(oleDbReader(0)(0), Byte())

【讨论】:

这不是问题所在。 CType(oleDbReader(0), Byte()) 会将整个对象转换为 Byte 数组,这是 OP 想要的。实际上,您的代码将失败,因为 CType(oleDbReader(0)(0), Byte()) 将返回一个 single Byte 不能隐式转换为数组。 -1(对不起。) 我的立场得到纠正并感谢戈德。当数据阅读器公开文件(列)和行时,我希望它采用二维数组格式。我认为是时候摆脱输入数据集了。

以上是关于使用 VB.NET 从 Access 中检索长二进制数据(图像)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Access 数据库 VB.net 中检索特定数据?

如何在 VB.net 中使用 ROWNUM 从 MS-Access 数据库中检索数据

寻求代码设计建议:使用 VB.Net 和 Ms-Access

VB6/Microsoft Access/DAO 到 VB.NET/SQL Server... 有建议吗?

如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件

使用 vb.net 以编程方式将 Access 数据库从 03 转换为 07?