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

标签 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)

最佳答案

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

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

更多详情见我的另一个回答here ,它展示了如何使用早期答案中的代码“展开”对象 here .

关于sql - 使用 VB.NET 从 Access 中检索长二进制数据(图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976958/

相关文章:

c - 在 VB.NET 项目中添加 DLL 的更好方法

c - 从 vb.net 向非托管 C api 传递参数

带下划线或句点的 SQL id 列

sql - 使用 ORDER BY 子句查询 View 时出现 Oracle 内部错误

vb.net - 使用 LINQ 从 List(of ParentObject) 中查找重复的子项

python - 如何在python中指定时间后自动关闭mysql连接?

mysql - 如何对我在 Wordpress 数据库中创建的自定义表进行 SQL 注入(inject)证明调用?

mysql - SQL 查询查找正确运行的引擎对

php - 距离计算未返回结果

java - 使用多个查询从不同表中获取数据