C#结合SQLite数据库使用方法

时间:2025-04-08 07:11:27

一、关于SQLite

SQLite 是一个轻量级的嵌入式关系型数据库管理系统(RDBMS)。与传统的数据库管理系统(如 MySQL、PostgreSQL 或 SQL Server)不同,SQLite 并不需要运行单独的服务器进程,它的数据库存储在一个单一的文件中,因此被称为“嵌入式数据库”。SQLite 常常用于需要小型、快速且无需复杂配置的应用场景。

 SQLite的特点:

1. 轻量级:

   SQLite 是一个非常小的数据库引擎,源代码可以轻松集成到各种应用程序中,适合嵌入式系统和移动应用。其核心库的大小通常只有几百 KB。

2. 零配置:

   与传统的数据库管理系统不同,SQLite 不需要配置服务器、网络连接或管理员权限。它直接通过文件系统进行操作,创建一个单一的数据库文件来存储所有数据。

3. 跨平台支持:

   SQLite 是跨平台的,可以在几乎所有操作系统上运行,包括 Windows、Linux、macOS、iOS、Android 等。它使得开发者能够在不同平台间共享数据。

4. 文件存储:

   所有的数据存储都在一个单一的文件中,这个文件通常很容易复制、备份和移动。

5. 支持标准SQL:

   SQLite 支持 SQL-92 标准的大部分功能,包括查询、事务、触发器、索引等功能,使得开发者可以使用熟悉的 SQL 语法进行数据操作。

6. 事务性:

   SQLite 支持事务,能够确保数据库的操作具有原子性、持久性、一致性和隔离性(ACID 特性)。即使在应用程序崩溃或断电的情况下,数据也能够保持一致性。

7. 无服务器:

   SQLite 是一个无服务器数据库,它直接嵌入到应用程序中。它不需要启动独立的数据库服务器进程,因此启动速度快,资源消耗小。

 使用场景:

1. 移动应用:

   因为 SQLite 轻便且不需要复杂配置,它非常适合用于移动设备(如 Android 和 iOS)的数据存储。

2. 桌面应用:

   在小型桌面应用中,SQLite 是一种理想的数据库解决方案,尤其是那些不需要多个并发用户的应用。

3. Web应用:

   SQLite 也可以作为一些中小型网站的后端数据库,尤其是在开发阶段或低流量的网站中。

4. 物联网(IoT)设备:

   SQLite 常被用在物联网设备中,作为嵌入式数据库存储数据。

 总结:

SQLite 由于其高效、简单、零配置、跨平台的特性,在许多应用场景中都得到了广泛的应用。它对于开发者来说是一款非常方便的工具,尤其适用于嵌入式系统、桌面软件、移动应用等不需要复杂数据库系统的场合。
 

二、常用的sql语句(CRUD)

*. 创建一个新的数据库表

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 自动递增的ID
    name TEXT NOT NULL,                    -- 用户名
    age INTEGER NOT NULL                   -- 年龄
);

1. 给数据库中添加数据

### 插入数据

INSERT INTO "表名" (字段1,字段2,字段3...) VALUES(值1,值2,值3...);

### 插入多条数据

INSERT INTO "表名" (字段1,字段2,字段3...) VALUES(值1,值2,值3...),(值1,值2,值3...);

2. 删除数据库中的数据

### 删除特定数据,示例

DELETE FROM users WHERE id = 1;
### 删除所有数据

DELETE FROM users;

3. 查找数据

### 查询所有数据

SELECT * FROM users;
### 查询特定列的数据

SELECT name, age FROM users;
### 查询符合条件的数据

SELECT * FROM users WHERE age > 30;
### 查询单挑数据

SELECT * FROM users WHERE id = 1;

4. 更新数据 

### 更新数据库中某个字段的值为某个值

UPDATE users SET age = 26 WHERE id = 1;

三、用C#代码封装SQLite数据库的各个方法实现增删改查

C#连接SQLite数据库实现增删改查

namespace DB
{
    public class DataBase
    {
        private readonly string _connectionString;
        // 数据库文件位置
        private static readonly string databasePath = @"数据库文件路径"; 

        public DataBase()
        {
            _connectionString = $"Data Source={databasePath};Version=3;";
        }
        /// <summary>
        /// 打开数据库连接
        /// </summary>
        /// <returns>SQLiteConnection 对象</returns>
        private SQLiteConnection OpenConnection()
        {
            var connection = new SQLiteConnection(_connectionString);
            connection.Open();
            return connection;
        }

        /// <summary>
        /// 通用方法:执行非查询命令(增、删、改)
        /// </summary>
        /// <param name="query">SQL 查询语句</param>
        /// <param name="parameters">查询参数</param>
        /// <returns>受影响的行数</returns>
        public int ExecuteNonQuery(string query, Dictionary<string, object> parameters = null)
        {
            using var connection = OpenConnection();
            using var command = new SQLiteCommand(query, connection);
            // 添加参数
            if (parameters != null)
            {
                foreach (var param in parameters)
                {
                    command.Parameters.AddWithValue(param.Key, param.Value);
                }
            }
            return command.ExecuteNonQuery();
        }

        /// <summary>
        /// 通用方法:执行查询并返回结果
        /// </summary>
        /// <param name="query">SQL 查询语句</param>
        /// <param name="parameters">查询参数</param>
        /// <returns>查询结果 DataTable</returns>
        public DataTable ExecuteQuery(string query, Dictionary<string, object> parameters = null)
        {
            using var connection = OpenConnection();
            using var command = new SQLiteCommand(query, connection);
            // 添加参数
            if (parameters != null)
            {
                foreach (var param in parameters)
                {
                    command.Parameters.AddWithValue(param.Key, param.Value);
                }
            }
            using (var adapter = new SQLiteDataAdapter(command))
            {
                var dataTable = new DataTable();
                adapter.Fill(dataTable);
                return dataTable;
            }
        }

        /// <summary>
        /// 增加方法
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="data"></param>
        public void Insert(string tableName, Dictionary<string, object> data)
        {
            var columns = string.Join(", ", data.Keys);
            var placeholders = string.Join(", ", data.Keys.Select(key => "@" + key));
            var query = $"INSERT INTO {tableName} ({columns}) VALUES ({placeholders})";            
            ExecuteNonQuery(query, data);
        }
        /// <summary>
        /// 删除方法
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="whereClause"></param>
        /// <param name="parameters"></param>
        public void Delete(string tableName, string whereClause, Dictionary<string, object> parameters)
        {
            var query = $"DELETE FROM {tableName} WHERE {whereClause}";
            ExecuteNonQuery(query, parameters);
        }
        /// <summary>
        /// 查询方法
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="whereClause"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public DataTable Select(string tableName, string whereClause = null, Dictionary<string, object> parameters = null)
        {
            var query = $"SELECT * FROM {tableName}";
            if (!string.IsNullOrEmpty(whereClause))
            {
                query += $" WHERE {whereClause}";
            }

            return ExecuteQuery(query, parameters);
        }
        /// <summary>
        /// 更新方法
        /// </summary>
        /// <param name="tableName"></param>
        /// <param name="data"></param>
        /// <param name="whereClause"></param>
        /// <param name="parameters"></param>
        public void Update(string tableName, Dictionary<string, object> data, string whereClause, Dictionary<string, object> parameters)
        {
            // var setClause = string.Join(", ", data.Keys, key => $"{key} = @{key}");
            var setClause = string.Join(", ", data.Keys.Select(key => $"{key} = @{key}"));
            var query = $"UPDATE {tableName} SET {setClause} WHERE {whereClause}";

            // 合并参数
            if (parameters == null)
            {
                parameters = new Dictionary<string, object>();
            }
            foreach (var param in data)
            {
                parameters[$"@{param.Key}"] = param.Value;
            }

            ExecuteNonQuery(query, parameters);
        }
    }
}

创建数据库对象,并进行调用增删查改方法

创建数据库对象

private static readonly DB sqlite = new();

添加数据

给数据库中所有非null值进行赋值。

sqlite.Insert("tabel", new Dictionary<string, object> {
    {"createTime",DateTime.Now },
    { "age",18},
    { "name","Peter"},
});

删除数据

删除表中字段为name,并且name为Peter的一条数据。

sqlite.Delete("tabel", "name = @name", 
    new Dictionary<string, object> { { "@name","Peter"  } 
});

查找数据

查找表中的name字段为Peter的全部信息

sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{
    {"name","Peter" }
});

更新数据

将数据库中name字段为Peter的数据中的age字段改为25.

sqlite.Update(new Dictionary<string, object> { { "age", 25 } },
    "name = @name",
    new Dictionary<string, object>{ { "@name","Peter"}
});

四、获取数据库中查询得到的全部数据

查询返回的数据类型为DataTable类型。

DataTable dataTable = sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{
    {"name","Peter" }
});
foreach (DataRow row in dataTable.Rows)
{
    Console.WriteLine(row["createTime"]);
    Console.WriteLine(row["age"]);
    Console.WriteLine(row["name"]);
}

查询当前条件在数据库中是否有匹配的内容。

DataTable dataTable = sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{
    {"name","Peter" }
});
if(dataTable.Rows.Count==0) Console.WriteLine("在数据库中没有找到指定内容");