| 工具 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Navicat for SQLite | 功能完整、操作直覺、支援匯入匯出、結構同步 | 無法開啟 System.Data.SQLite 加密資料庫 |
日常開發、結構設計、資料維護 |
| Database.Net | 支援 10+ 種資料庫、可開啟/設定 SQLite 加密、免安裝綠色版 | 功能較精簡 | 加密資料庫操作、多資料庫混合環境 |
建議策略: 以 Navicat 為主力,遇到加密庫再用 Database.Net。
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。
無交易(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。
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。