简体   繁体   中英

vb.net Loading Images from Access Database to DataTable?

So I have a MS Access Database with 1 table (Records) and 2 fields in it ("RecordID" (Number), which is the primary key, and "LowRes" (OLE Object) which is a low Resolution image). There are about 100 records.

I/m trying to load the Access Table into a DataTable (ID_Table) in VB.net.

Code so far:

    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

However the "DirectCast" command fails when I tell it to look at more then 1 field in my SQL statement with a datatype mismatch (if I just do [LowRes] it does not throw a error). However, I get stuck again when trying to apply the result to the table via the objDataAdapter, it doesnt fill the table with anything? I also notice that "picture" only contains the first image in the database.

I could put this database query in a function using "WHERE RECORDID=..." and loop it manually building the table returning "picture" each time, but Id like to avoid running a function 100 times, esp one that access a database.

Is it possible to read the whole database that contains images and just load it directly into a Datatable in one big swoop?

EDIT: So I got this to work:

    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

how ever when I go to view row 0, col 1 which should be the first LowRes image via a .ToString Useing this code:

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

It just displays "System.Byte[]". It knows its a Byte datatype, but how do I display that in a picturebox?

The ExecuteScalar() executes the query, and returns the first column of the first row in the result set returned by the query.

as your query is

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

the first column is RecordID which is not a Byte() .

you can change your query as following:

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

or you have to use other methods to get data from the database

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM