# 使用 Visual Basic 在 SQLite 中处理图像

> 原文： [http://zetcode.com/db/sqliteimg/](http://zetcode.com/db/sqliteimg/)

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

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

```

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

## 插入图像

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

```vb
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`表中。

```vb
Dim data As Byte()

```

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

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

```

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

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

```

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

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

```

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

## 读取图像

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

```vb
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`中。

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

```

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

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

```

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

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

```

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

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