我的代码是
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 包装器。
关于sql - 使用 VB.NET 从 Access 中检索长二进制数据(图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21976958/