原文: http://zetcode.com/db/sqliteimg/

在 SQLite Visual Basic 教程的这一章中,我们将使用图像文件。 请注意,有些人反对将图像放入数据库。 在这里,我们只展示如何做。 我们不讨论天气技术问题是否将图像保存在数据库中。

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

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

插入图像

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

  1. Option Strict On
  2. Imports System.IO
  3. Imports System.Data
  4. Imports Mono.Data.Sqlite
  5. Module Example
  6. Sub Main()
  7. Dim cs As String = "URI=file:test.db"
  8. Using con As New SqliteConnection(cs)
  9. con.Open()
  10. Dim data As Byte()
  11. Try
  12. data = File.ReadAllBytes("woman.jpg")
  13. Catch ex As Exception
  14. Console.WriteLine(ex.ToString())
  15. End Try
  16. Dim cmd As New SqliteCommand(con)
  17. cmd.CommandText = "INSERT INTO Images(Data) VALUES (@img)"
  18. cmd.Prepare()
  19. cmd.Parameters.Add("@img", DbType.Binary, data.Length)
  20. cmd.Parameters("@img").Value = data
  21. cmd.ExecuteNonQuery()
  22. con.Close()
  23. End Using
  24. End Sub
  25. End Module

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

  1. Dim data As Byte()

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

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

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

  1. cmd.CommandText = "INSERT INTO Images(Data) VALUES (@img)"
  2. 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 教程的这一部分专门用于读取和写入图像。