使用 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... 有建议吗?