# 使用 C# 在 SQLite 中处理图像

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

在 SQLite C# 教程的这一章中，我们将使用图像文件。 请注意，有些人反对将图像放入数据库。 在这里，我们仅展示如何执行此操作，并且避免了是否将图像保存在数据库中的技术问题。

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

```

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

## 插入图像

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

```cs
using System;
using System.IO;
using System.Data;
using Mono.Data.Sqlite;

public class Example
{
    static void Main() 
    {

        string cs = "URI=file:test.db";        

        using(SqliteConnection con = new SqliteConnection(cs))
        {

            con.Open();

            byte[] data = null;

            try
            {
                data = File.ReadAllBytes("woman.jpg");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

            SqliteCommand cmd = 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();
        }
    }
}

```

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

```cs
byte[] data = null;

```

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

```cs
data = File.ReadAllBytes("woman.jpg");

```

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

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

```

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

```cs
cmd.Parameters.Add("@img", DbType.Binary, data.Length);
cmd.Parameters["@img"].Value = data;
cmd.ExecuteNonQuery();

```

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

## 读取图像

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

```cs
using System;
using System.IO;
using Mono.Data.Sqlite;

public class Example
{

    static void Main() 
    {
        string cs = "URI=file:test.db";        

        using(SqliteConnection con = new SqliteConnection(cs))
        {            
            con.Open();

            SqliteCommand cmd = new SqliteCommand(con);   
            cmd.CommandText = "SELECT Data FROM Images WHERE Id=1";
            byte[] data = (byte[]) cmd.ExecuteScalar();

            try
            {               
                if (data != null)
                { 
                    File.WriteAllBytes("woman2.jpg", data);
                } else 
                {
                    Console.WriteLine("Binary data not read");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }            

            con.Close();
        }
    }
}

```

我们从`Images`表中读取图像数据，并将其写入另一个文件`woman2.jpg`中。

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

```

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

```cs
byte[] data = (byte[]) cmd.ExecuteScalar();

```

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

```cs
if (data != null)
{ 
    File.WriteAllBytes("woman2.jpg", data);
} else 
{
    Console.WriteLine("Binary data not read");
}

```

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

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