我的代码是
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)
答案 0 :(得分:1)
您的代码本身没有任何问题。您的问题几乎肯定与Access从Access应用程序本身嵌入图像时存储图像的方式有关。在这些情况下,OLE“包装器”在存储在表中之前添加到原始图像数据中。从Access 中处理图像时,这可以正常工作,但是当处理来自.NET项目等外部应用程序的图像时,这可能会导致问题。
您的代码从Access数据库中检索OLE包装的图像对象,并尝试使用它创建.NET Image
对象。问题在于,虽然Image
对象可以识别各种图像类型(例如,位图,JPEG等),但是“OLE包装的图像对象格式”不是其中之一。因此,您需要从字节流中删除OLE包装器,然后再将其传递给Image.FromStream()
。
答案 1 :(得分:-2)
当您执行oleDbReader(0)时,您将获得返回的reader对象中第一个字段的字段名称。使用oleDbReader(0)(0)获取第一列中的第一项,你知道它是怎么回事。
Dim ImageBytes As Byte() = CType(oleDbReader(0)(0), Byte())