C#結(jié)合SQLite數(shù)據(jù)庫使用方法及應(yīng)用場景
一、關(guān)于SQLite
SQLite 是一個輕量級的嵌入式關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。與傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)(如 MySQL、PostgreSQL 或 SQL Server)不同,SQLite 并不需要運(yùn)行單獨(dú)的服務(wù)器進(jìn)程,它的數(shù)據(jù)庫存儲在一個單一的文件中,因此被稱為“嵌入式數(shù)據(jù)庫”。SQLite 常常用于需要小型、快速且無需復(fù)雜配置的應(yīng)用場景。
SQLite的特點(diǎn):
1. 輕量級:
SQLite 是一個非常小的數(shù)據(jù)庫引擎,源代碼可以輕松集成到各種應(yīng)用程序中,適合嵌入式系統(tǒng)和移動應(yīng)用。其核心庫的大小通常只有幾百 KB。
2. 零配置:
與傳統(tǒng)的數(shù)據(jù)庫管理系統(tǒng)不同,SQLite 不需要配置服務(wù)器、網(wǎng)絡(luò)連接或管理員權(quán)限。它直接通過文件系統(tǒng)進(jìn)行操作,創(chuàng)建一個單一的數(shù)據(jù)庫文件來存儲所有數(shù)據(jù)。
3. 跨平臺支持:
SQLite 是跨平臺的,可以在幾乎所有操作系統(tǒng)上運(yùn)行,包括 Windows、Linux、macOS、iOS、Android 等。它使得開發(fā)者能夠在不同平臺間共享數(shù)據(jù)。
4. 文件存儲:
所有的數(shù)據(jù)存儲都在一個單一的文件中,這個文件通常很容易復(fù)制、備份和移動。
5. 支持標(biāo)準(zhǔn)SQL:
SQLite 支持 SQL-92 標(biāo)準(zhǔn)的大部分功能,包括查詢、事務(wù)、觸發(fā)器、索引等功能,使得開發(fā)者可以使用熟悉的 SQL 語法進(jìn)行數(shù)據(jù)操作。
6. 事務(wù)性:
SQLite 支持事務(wù),能夠確保數(shù)據(jù)庫的操作具有原子性、持久性、一致性和隔離性(ACID 特性)。即使在應(yīng)用程序崩潰或斷電的情況下,數(shù)據(jù)也能夠保持一致性。
7. 無服務(wù)器:
SQLite 是一個無服務(wù)器數(shù)據(jù)庫,它直接嵌入到應(yīng)用程序中。它不需要啟動獨(dú)立的數(shù)據(jù)庫服務(wù)器進(jìn)程,因此啟動速度快,資源消耗小。
使用場景:
1. 移動應(yīng)用:
因?yàn)?SQLite 輕便且不需要復(fù)雜配置,它非常適合用于移動設(shè)備(如 Android 和 iOS)的數(shù)據(jù)存儲。
2. 桌面應(yīng)用:
在小型桌面應(yīng)用中,SQLite 是一種理想的數(shù)據(jù)庫解決方案,尤其是那些不需要多個并發(fā)用戶的應(yīng)用。
3. Web應(yīng)用:
SQLite 也可以作為一些中小型網(wǎng)站的后端數(shù)據(jù)庫,尤其是在開發(fā)階段或低流量的網(wǎng)站中。
4. 物聯(lián)網(wǎng)(IoT)設(shè)備:
SQLite 常被用在物聯(lián)網(wǎng)設(shè)備中,作為嵌入式數(shù)據(jù)庫存儲數(shù)據(jù)。
總結(jié):
SQLite 由于其高效、簡單、零配置、跨平臺的特性,在許多應(yīng)用場景中都得到了廣泛的應(yīng)用。它對于開發(fā)者來說是一款非常方便的工具,尤其適用于嵌入式系統(tǒng)、桌面軟件、移動應(yīng)用等不需要復(fù)雜數(shù)據(jù)庫系統(tǒng)的場合。
二、常用的sql語句(CRUD)
*. 創(chuàng)建一個新的數(shù)據(jù)庫表
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT, -- 自動遞增的ID
name TEXT NOT NULL, -- 用戶名
age INTEGER NOT NULL -- 年齡
);1. 給數(shù)據(jù)庫中添加數(shù)據(jù)
插入數(shù)據(jù)
INSERT INTO "表名" (字段1,字段2,字段3...) VALUES(值1,值2,值3...);
插入多條數(shù)據(jù)
INSERT INTO "表名" (字段1,字段2,字段3...) VALUES(值1,值2,值3...),(值1,值2,值3...);
2. 刪除數(shù)據(jù)庫中的數(shù)據(jù)
刪除特定數(shù)據(jù)
DELETE FROM users WHERE id = 1;
刪除所有數(shù)據(jù)
DELETE FROM users;
3. 查找數(shù)據(jù)
查詢所有數(shù)據(jù)
SELECT * FROM users;
查詢特定列的數(shù)據(jù)
SELECT name, age FROM users;
查詢符合條件的數(shù)據(jù)
關(guān)系運(yùn)算符
| 符號 | 含義 |
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| !=或<> | 不等于 |
| ==或= | 等于 |
SELECT * FROM users WHERE age > 30;
查詢范圍運(yùn)算
SELECT * FROM users WHERE age BETWEEN 1 AND 100;
// 如果表里有日期類型的數(shù)據(jù)的話 SELECT * FROM users WHERE date BETWEEN '1981-01-01' AND '1981-12-31';
模糊查詢
| 符號 | 含義 |
| _ | 匹配任意一個字符 |
| % | 匹配任意多個字符 |
SELECT * FROM users WHERE name LIKE '%er%'; SELECT * FROM users WHERE name LIKE '_e_';
查詢字段為空的內(nèi)容
SELECT * FROM users WHERE age IS NULL; SELECT * FROM users WHERE age IS NOT NULL;
查詢單挑數(shù)據(jù)
SELECT * FROM users WHERE id = 1;
附加多個條件
SELECT * FROM users WHERE name = 'Peter' AND age > 20;
4. 更新數(shù)據(jù)
更新數(shù)據(jù)庫中某個字段的值為某個值
UPDATE users SET age = 26 WHERE id = 1;
5. 查詢排序
讓數(shù)據(jù)庫中一列或多列按照升序或者降序的順序排序。
| 名稱 | 含義 |
| ASC | 升序 |
| DESC | 降序 |
查詢表中所有信息按照age降序排列
SELECT * FROM users ORDER BY age DESC;
查詢表中所有信息按照age降序排列,如果age相同那么按照id升序排列
SELECT * FROM users ORDER BY age DESC,id ASC;
三、用C#代碼封裝SQLite數(shù)據(jù)庫的各個方法實(shí)現(xiàn)增刪改查
NuGet安裝 System.Data.SQLite組件

C#連接SQLite數(shù)據(jù)庫實(shí)現(xiàn)增刪改查
namespace DB
{
public class DataBase
{
private readonly string _connectionString;
// 數(shù)據(jù)庫文件位置
private static readonly string databasePath = @"數(shù)據(jù)庫文件路徑";
public DataBase()
{
_connectionString = $"Data Source={databasePath};Version=3;";
}
/// <summary>
/// 打開數(shù)據(jù)庫連接
/// </summary>
/// <returns>SQLiteConnection 對象</returns>
private SQLiteConnection OpenConnection()
{
var connection = new SQLiteConnection(_connectionString);
connection.Open();
return connection;
}
/// <summary>
/// 通用方法:執(zhí)行非查詢命令(增、刪、改)
/// </summary>
/// <param name="query">SQL 查詢語句</param>
/// <param name="parameters">查詢參數(shù)</param>
/// <returns>受影響的行數(shù)</returns>
public int ExecuteNonQuery(string query, Dictionary<string, object> parameters = null)
{
using var connection = OpenConnection();
using var command = new SQLiteCommand(query, connection);
// 添加參數(shù)
if (parameters != null)
{
foreach (var param in parameters)
{
command.Parameters.AddWithValue(param.Key, param.Value);
}
}
return command.ExecuteNonQuery();
}
/// <summary>
/// 通用方法:執(zhí)行查詢并返回結(jié)果
/// </summary>
/// <param name="query">SQL 查詢語句</param>
/// <param name="parameters">查詢參數(shù)</param>
/// <returns>查詢結(jié)果 DataTable</returns>
public DataTable ExecuteQuery(string query, Dictionary<string, object> parameters = null)
{
using var connection = OpenConnection();
using var command = new SQLiteCommand(query, connection);
// 添加參數(shù)
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}";
// 合并參數(shù)
if (parameters == null)
{
parameters = new Dictionary<string, object>();
}
foreach (var param in data)
{
parameters[$"@{param.Key}"] = param.Value;
}
ExecuteNonQuery(query, parameters);
}
}
}創(chuàng)建數(shù)據(jù)庫對象,并進(jìn)行調(diào)用增刪查改方法
創(chuàng)建數(shù)據(jù)庫對象
private static readonly DB sqlite = new();
添加數(shù)據(jù)
給數(shù)據(jù)庫中所有非null值進(jìn)行賦值。
sqlite.Insert("tabel", new Dictionary<string, object> {
{"createTime",DateTime.Now },
{ "age",18},
{ "name","Peter"},
});刪除數(shù)據(jù)
刪除表中字段為name,并且name為Peter的一條數(shù)據(jù)。
sqlite.Delete("tabel", "name = @name",
new Dictionary<string, object> { { "@name","Peter" }
});查找數(shù)據(jù)
查找表中的name字段為Peter的全部信息
sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{
{"name","Peter" }
});更新數(shù)據(jù)
將數(shù)據(jù)庫中name字段為Peter的數(shù)據(jù)中的age字段改為25.
sqlite.Update(new Dictionary<string, object> { { "age", 25 } },
"name = @name",
new Dictionary<string, object>{ { "@name","Peter"}
});四、獲取數(shù)據(jù)庫中查詢得到的全部數(shù)據(jù)
查詢返回的數(shù)據(jù)類型為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"]);
}查詢當(dāng)前條件在數(shù)據(jù)庫中是否有匹配的內(nèi)容。
DataTable dataTable = sqlite.Select("tabel","name = @name", new Dictionary<string, object>
{
{"name","Peter" }
});
if(dataTable.Rows.Count==0) Console.WriteLine("在數(shù)據(jù)庫中沒有找到指定內(nèi)容");到此這篇關(guān)于C#結(jié)合SQLite數(shù)據(jù)庫使用方法的文章就介紹到這了,更多相關(guān)c# sqlite數(shù)據(jù)庫使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C#操作SQLite數(shù)據(jù)庫方法小結(jié)
- C#連接加密的Sqlite數(shù)據(jù)庫的方法
- C#操作SQLite數(shù)據(jù)庫之讀寫數(shù)據(jù)庫的方法
- C#操作SQLite數(shù)據(jù)庫方法小結(jié)(創(chuàng)建,連接,插入,查詢,刪除等)
- C#簡單查詢SQLite數(shù)據(jù)庫是否存在數(shù)據(jù)的方法
- C#簡單訪問SQLite數(shù)據(jù)庫的方法(安裝,連接,查詢等)
- C#中嵌入SQLite數(shù)據(jù)庫的簡單方法
- Windows 8 Metro用C#連接SQLite及創(chuàng)建數(shù)據(jù)庫,數(shù)據(jù)表的增刪改查的實(shí)現(xiàn)
- C#中使用SQLite數(shù)據(jù)庫的方法介紹
相關(guān)文章
Unity UGUI教程之實(shí)現(xiàn)滑頁效果
使用UGUI提供的ScrollRect和ScrollBar組件實(shí)現(xiàn)基本滑動以及自己控制每次移動一頁來達(dá)到滑頁的效果。具體實(shí)現(xiàn)思路請參考下本教程2016-04-04
C#開發(fā)Winform實(shí)現(xiàn)文件操作案例
這篇文章介紹了C#開發(fā)Winform實(shí)現(xiàn)文件操作的案例,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04

