【问题标题】:vb.net Loading Images from Access Database to DataTable?vb.net 将图像从 Access 数据库加载到 DataTable?
【发布时间】: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[]”。它知道它是一个字节数据类型,但我如何在图片框中显示它?

【问题讨论】:

标签: sql database vb.net image ms-access


【解决方案1】:

ExecuteScalar() 执行查询,并返回查询返回的结果集中第一行的第一列。

因为您的查询是

Dim theQuery As String = "SELECT [RecordID], [LowRes] FROM [Records];"

第一列是RecordID,它不是Byte()

您可以按如下方式更改您的查询:

Dim theQuery As String = "SELECT [LowRes] FROM [Records];"

或者你必须使用其他方法从数据库中获取数据

Dim strSql As String = "SELECT [RecordID], [LowRes] FROM [Records]"
Dim dtb As New DataTable
Using cnn As New OleDbConnection(connectionString)
    cnn.Open()
    Using dad As New OleDbDataAdapter(strSql, cnn)
        dad.Fill(dtb)
    End Using
    cnn.Close()
End Using

【讨论】:

  • 那么是否有海量的“ExecuteScalar()”来读取并返回具有不同数据类型的多个字段的多条记录?
  • ExecuteScalar 应该用于像SELECT Count(*) FROM Table1 这样的单个项目。要读取您可以使用DataAdapter.Fill 的所有数据,如更新的答案所示
  • dtb 为空,但我知道它是对数据库中数据的有效查询。
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 2012-08-17
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多