使用 C# 在 SQLite 中处理图像
在 SQLite C# 教程的这一章中,我们将使用图像文件。 请注意,有些人反对将图像放入数据库。 在这里,我们仅展示如何执行此操作,并且避免了是否将图像保存在数据库中的技术问题。
sqlite> CREATE TABLE Images(Id INTEGER PRIMARY KEY, Data BLOB);
对于此示例,我们创建一个名为Images
的新表。 对于图像,我们使用BLOB
数据类型,代表二进制大对象。
插入图像
在第一个示例中,我们将图像插入 SQLite 数据库。
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
表中。
byte[] data = null;
图像数据将存储在字节数组中。
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();
我们将二进制数据绑定到预备语句。 然后执行该语句。 该图像被写入数据库表。
读取图像
在本节中,我们将执行相反的操作。 我们将从数据库表中读取图像。
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
中。
cmd.CommandText = "SELECT Data FROM Images WHERE Id=1";
该行从表中选择图像数据。
byte[] data = (byte[]) cmd.ExecuteScalar();
我们从数据库表中检索二进制数据。 数据存储在字节数组中。
if (data != null)
{
File.WriteAllBytes("woman2.jpg", data);
} else
{
Console.WriteLine("Binary data not read");
}
WriteAllBytes()
方法创建一个新文件,将指定的字节数组写入该文件,然后关闭该文件。 如果目标文件已经存在,则将其覆盖。 当数据库表为空并运行此示例时,我们得到一个空值。 因此,我们检查空值。
SQLite C# 教程的这一部分专门用于读取和写入图像。