ZetCode

使用 Visual Basic 在 SQLite 中处理图像

最后修改于 2020 年 7 月 6 日

在本 SQLite Visual Basic 教程的这一章中,我们将处理图像文件。请注意,有些人反对将图像放入数据库。我们在这里只展示如何做到这一点。我们不会深入研究是否将图像保存在数据库中的技术问题。

sqlite> CREATE TABLE Images(Id INTEGER PRIMARY KEY, Data BLOB);

对于本例,我们创建一个名为 Images 的新表。对于图像,我们使用 BLOB 数据类型,它代表二进制大对象。

插入图像

在第一个例子中,我们将向 SQLite 数据库插入一张图像。

Option Strict On

Imports System.IO
Imports System.Data
Imports Mono.Data.Sqlite

Module Example

    Sub Main()

        Dim cs As String = "URI=file:test.db"

        Using con As New SqliteConnection(cs)
        
            con.Open()
        
            Dim data As Byte()

            Try
                data = File.ReadAllBytes("woman.jpg")
            Catch ex As Exception
                Console.WriteLine(ex.ToString())
            End Try
 
            Dim cmd As New SqliteCommand(con)
    
            cmd.CommandText = "INSERT INTO Images(Data) VALUES (@img)"
            cmd.Prepare()

            cmd.Parameters.Add("@img", DbType.Binary, data.Length)
            cmd.Parameters("@img").Value = data
            cmd.ExecuteNonQuery()

            con.Close()

        End Using
        
    End Sub

End Module

我们从当前工作目录读取一张图像,并将其写入 SQLite test.db 数据库的 Images 表中。

Dim data As Byte()

图像数据将存储在一个字节数组中。

data = File.ReadAllBytes("woman.jpg")

ReadAllBytes 方法打开一个二进制文件,将文件的内容读取到字节数组中,然后关闭该文件。

cmd.CommandText = "INSERT INTO Images(Data) VALUES (@img)"
cmd.Prepare()

我们准备一个 SQL 语句,用于将字节数组插入到 Images 表的 Data 列中。

cmd.Parameters.Add("@img", DbType.Binary, data.Length)
cmd.Parameters("@img").Value = data
cmd.ExecuteNonQuery()

我们将二进制数据绑定到准备好的语句。然后执行该语句。图像被写入数据库表。

读取图像

在本节中,我们将执行相反的操作。我们将从数据库表中读取一张图像。

Option Strict On

Imports System.IO
Imports System.Data
Imports Mono.Data.Sqlite

Module Example

    Sub Main()

        Dim cs As String = "URI=file:test.db"

        Using con As New SqliteConnection(cs)
        
            con.Open()
        
            Dim cmd As New SqliteCommand(con)
            cmd.CommandText = "SELECT Data FROM Images WHERE Id=1"

            Dim data As Byte() = cmd.ExecuteScalar()

            Try                           
                If data IsNot Nothing
                    File.WriteAllBytes("woman2.jpg", data)
                Else 
                    Console.WriteLine("Binary data not read")
                End If

            Catch ex As Exception            
                Console.WriteLine(ex.ToString())
            End Try    

            con.Close()

        End Using
        
    End Sub

End Module

我们从 Images 表中读取图像数据,并将其写入另一个文件,我们称之为 woman2.jpg

cmd.CommandText = "SELECT Data FROM Images WHERE Id=1"

此行从表中选择图像数据。

Dim data As Byte() = cmd.ExecuteScalar()

我们从数据库表中检索二进制数据。数据存储在一个字节数组中。

If data IsNot Nothing
    File.WriteAllBytes("woman2.jpg", data)
Else 
    Console.WriteLine("Binary data not read")
End If

WriteAllBytes 方法创建一个新文件,将指定的字节数组写入该文件,然后关闭该文件。如果目标文件已存在,则会被覆盖。当数据库表为空且我们运行此示例时,我们得到 Nothing。因此,我们检查 Nothing 值。

SQLite Visual Basic 教程的这一部分专门用于读取和写入图像。