SQL Server Compact(SQL CE)是 Windows CE / Windows Mobile 最常用的嵌入式資料庫,最新版為 SQL Server Compact 3.5 SP1。它也能運行於桌面版 Windows,是 Access 的優質替代品;若不使用預存程序,程式碼幾乎無需修改即可移植至完整版 SQL Server。
C:\Program Files\Microsoft SQL Server Compact Edition\v3.5C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile不同版本 DLL 不相容,但命名空間一致(System.Data.SqlServerCe),程式碼可共用。
封裝連線、命令、資料讀取、資料集、純量值與交易操作:
class SqlCeHelper : IDisposable {
private SqlCeConnection connection;
private SqlCeCommand command;
private const string connectionString = "Data Source=/DB/db.sdf";
#region 連線管理
public void Open() {
try {
connection = new SqlCeConnection(connectionString);
command = connection.CreateCommand();
command.Connection = connection;
command.CommandType = CommandType.Text; // CE 不支援預存程序
connection.Open();
} catch (DataException e) { Console.WriteLine(e.Message); }
}
public void Close() {
connection?.Close();
connection?.Dispose();
}
public void Dispose() {
Close();
command?.Dispose();
}
#endregion
#region 執行操作
public SqlCeDataReader ExecuteReader(string sql) { /* ... */ }
public DataSet ExecuteDataSet(string sql) { /* 使用 SqlCeDataAdapter.Fill */ }
public int ExecuteNonQuery(string sql) { /* 傳回影響列數 */ }
public object ExecuteScalar(string sql) { /* 傳回單一值 */ }
#endregion
#region 交易控制
public void BeginTransaction() { command.Transaction = connection.BeginTransaction(); }
public void CommitTransaction() { command.Transaction.Commit(); }
public void RollbackTransaction() { command.Transaction.Rollback(); }
#endregion
}
.sdf 檔案路徑,實務上可透過建構函式或 Open() 參數傳入。ExecuteReader(資料流)、ExecuteDataSet(離線資料集)、ExecuteNonQuery(增刪改)、ExecuteScalar(純量)。BeginTransaction/CommitTransaction/RollbackTransaction 封裝標準 ADO.NET 交易模式。
SqlCeHelper sqlCe = new SqlCeHelper();
sqlCe.Open();
sqlCe.BeginTransaction();
try {
if (sqlCe.ExecuteNonQuery("DELETE FROM t") < 0) throw new Exception();
if (sqlCe.ExecuteNonQuery("INSERT INTO t (f1, f2) VALUES (1, 'abc')") < 0) throw new Exception();
using (SqlCeDataReader reader = sqlCe.ExecuteReader("SELECT * FROM t WHERE f1 = 1")) {
while (reader.Read()) Console.WriteLine("reader: f2:{0}", reader["f2"]);
}
if (sqlCe.ExecuteNonQuery("UPDATE t SET f2 = 'xyz'") < 0) throw new Exception();
DataSet ds = sqlCe.ExecuteDataSet("SELECT * FROM t");
foreach (DataRow dr in ds.Tables[0].Rows)
Console.WriteLine("dataset: f2:{0}", dr["f2"]);
sqlCe.CommitTransaction();
} catch {
sqlCe.RollbackTransaction();
} finally {
sqlCe.Close();
}
操作流程:建立實例 → 開啟連線 → 開啟交易 → 執行 CRUD → 提交/回滾 → 關閉連線。using 區塊確保 DataReader 正確釋放。