多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 使用 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# 教程的这一部分专门用于读取和写入图像。