【发布时间】:2017-01-26 05:29:31
【问题描述】:
所以我有一个 MS Access 数据库,其中包含 1 个表(记录)和 2 个字段(“RecordID”(数字)是主键,“LowRes”(OLE 对象)是低分辨率图像) .大约有 100 条记录。
我/我正在尝试将 Access Table 加载到 VB.net 中的 DataTable (ID_Table) 中。
到目前为止的代码:
Dim cnString As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=SBS2257_ID.accdb;"
Dim theQuery As String = "SELECT [RecordID], [LowRes] FROM [Records];"
Using CN As New OleDbConnection(cnString)
Dim command As New OleDbCommand(theQuery, CN)
Using objDataAdapter = New OleDbDataAdapter(command)
Dim ID_Table As New DataTable
CN.Open()
Dim pictureData As Byte() = DirectCast(command.ExecuteScalar(), Byte())
Dim picture As Image = Nothing
Using stream As New IO.MemoryStream(pictureData)
picture = Image.FromStream(stream)
objDataAdapter.Fill(ID_Table)
End Using
End Using
End Using
但是,当我告诉“DirectCast”命令在我的 SQL 语句中查看超过 1 个数据类型不匹配的字段时,它会失败(如果我只是执行 [LowRes] 它不会引发错误)。但是,当我尝试通过 objDataAdapter 将结果应用到表时,我又卡住了,它没有用任何东西填充表吗?我还注意到“图片”只包含数据库中的第一张图片。
我可以使用“WHERE RECORDID=...”将此数据库查询放入一个函数中,并循环手动构建每次返回“图片”的表,但我想避免运行一个函数 100 次,尤其是访问一个数据库。
是否可以一举读取包含图像的整个数据库并将其直接加载到数据表中?
编辑:所以我得到了这个工作:
Dim strConnection As String = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=SBS2257_ID.accdb;"
Dim strSQL As String = "SELECT [RecordID], [LowRes] FROM [Records];"
Using objConnection = New OleDbConnection(strConnection)
Using objCommand = New OleDbCommand(strSQL, objConnection)
Using objDataAdapter = New OleDbDataAdapter(objCommand)
Dim objDataTable As New DataTable("IDs")
objDataAdapter.Fill(objDataTable)
Return objDataTable
End Using
End Using
End Using
当我通过 .ToString 查看第 0 行第 1 列应该是第一个 LowRes 图像时如何使用此代码:
Private Sub PrintValues(ByVal table As DataTable)
For Each row As DataRow In table.Rows
For Each col As DataColumn In table.Columns
MsgBox(row(col).ToString())
Next col
Next row
End Sub
它只显示“System.Byte[]”。它知道它是一个字节数据类型,但我如何在图片框中显示它?
【问题讨论】:
-
我觉得这个问题会对你有所帮助:stackoverflow.com/questions/18977554/…
标签: sql database vb.net image ms-access