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

时间:2014-02-24 00:53:37

标签: sql database vb.net ms-access

我的代码是

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)

2 个答案:

答案 0 :(得分:1)

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

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

有关详细信息,请参阅我的其他答案here,其中显示了如何使用先前答案here中的代码“解包”对象。

答案 1 :(得分:-2)

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

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