首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

C# 操作 SQLite 資料庫完整指南:工具選擇、效能優化與實戰範例

     編輯:ASP.NET 基礎

推薦管理工具

工具優點缺點適用場景
Navicat for SQLite 功能完整、操作直覺、支援匯入匯出、結構同步 無法開啟 System.Data.SQLite 加密資料庫 日常開發、結構設計、資料維護
Database.Net 支援 10+ 種資料庫、可開啟/設定 SQLite 加密、免安裝綠色版 功能較精簡 加密資料庫操作、多資料庫混合環境

建議策略: 以 Navicat 為主力,遇到加密庫再用 Database.Net。

實戰範例與關鍵差異

範例 1:整數欄位回傳 Int64 需雙重轉型

using (var cn = new SQLiteConnection("Data Source=|DataDirectory|省市.db;Version=3"))
using (var cmd = new SQLiteCommand("select count(*) from city", cn))
{
    cn.Open();
    // ExecuteScalar 回傳 object,實際為 Int64
    int recordCount = (int)(Int64)cmd.ExecuteScalar();
    // 或一步到位:Convert.ToInt32(cmd.ExecuteScalar())
    Response.Write(recordCount);
}

原因: SQLite COUNT(*) 回傳 INTEGER,ADO.NET 對應 Int64。C# 拆箱必須精確匹配原型別,故先轉 Int64 再轉 int。

範例 2:批量寫入必須使用交易,效能差異 500 倍

無交易(1000 筆 ≈ 70~90 秒):

for (int i = 0; i < 1000; i++) {
    cmd.CommandText = "insert into test values(@id,@name,@password)";
    cmd.Parameters.AddWithValue("@id", i);
    cmd.Parameters.AddWithValue("@name", "姓名" + i);
    cmd.Parameters.AddWithValue("@password", (i * 2).ToString());
    cmd.ExecuteNonQuery(); // 每次隱含交易 Commit,極慢
}

使用交易(1000 筆 ≈ 100~150 毫秒):

using (var tran = cn.BeginTransaction()) {
    cmd.Transaction = tran;
    try {
        for (int i = 0; i < 1000; i++) {
            cmd.CommandText = "insert into test values(@id,@name,@password)";
            cmd.Parameters.AddWithValue("@id", i);
            cmd.Parameters.AddWithValue("@name", "姓名" + i);
            cmd.Parameters.AddWithValue("@password", (i * 2).ToString());
            cmd.ExecuteNonQuery();
        }
        tran.Commit();
    } catch {
        tran.Rollback();
    }
}

原理: SQLite 預設每條 SQL 皆隱含交易,磁碟同步頻繁。顯式交易將多筆合併單次 Commit,大幅降低 I/O。

範例 3:封裝通用資料存取類

public class SQLiteData : IDisposable {
    private SQLiteConnection _cn;
    private SQLiteTransaction _tran;
    public SQLiteData(string connStr) { _cn = new SQLiteConnection(connStr); _cn.Open(); }
    public object ExecuteScalar(string sql, params object[] args) { /* 參數化執行 */ }
    public int ExecuteNonQuery(string sql, params object[] args) { /* 參數化執行 */ }
    public DataTable FillDataTable(string sql, params object[] args) { /* 回傳 DataTable */ }
    public void CreateTransaction() { _tran = _cn.BeginTransaction(); }
    public void CommitTransaction() { _tran?.Commit(); _tran = null; }
    public void RollBack() { _tran?.Rollback(); _tran = null; }
    public void Close() { _cn?.Close(); _cn?.Dispose(); }
    public void Dispose() { Close(); }
}

使用範例:

using (var md = new SQLiteData(connStr)) {
    md.CreateTransaction();
    try {
        for (int i=0; i<1000; i++)
            md.ExecuteNonQuery("insert into test values(@id,@name,@pwd)", i, "姓名"+i, (i*2).ToString());
        md.CommitTransaction();
    } catch { md.RollBack(); }
}

實用連結彙整

總結

SQLite 輕量、無伺服器、跨平台,適合嵌入式、桌面應用、中小型網站。掌握 Int64 拆箱、批量必用交易、參數化防注入、封裝通用類 四大要訣,即能高效、安全地在 .NET 中運用 SQLite。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved