跳转至

使用 C# 在 SQLite 中处理图像

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

在 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# 教程的这一部分专门用于读取和写入图像。



回到顶部