在Wince和Windows Mobile下最常用的數據庫為SQL CE,SQL CE也曾經叫做SQL Server for Windows CE和SQL Server
Mobile Edition,最新版本命名為SQL Server Compact 3.5 SP1。 SQL Server Compact不僅僅能運 行於Wince和Windows Mobile,而且能運行於Windows的PC上,是Access的有效替代品,如果不使用存儲 過程,在SQL Server Compact下開發的程序幾乎可以無修改移植到SQL Server的其他服務器版本上。可 以參見這篇文章 SQL Server Express和SQL Server Compact的應用 。在這篇文章中我會使用SQL CE 這一命名。
在.NET Compact Framework下進行SQL CE使用和開發,需要應用庫System.Data.SqlServerCe.dll, 需要注意的是不同的SQL CE版本使用不用的DLL版本. SQL CE 3.5的庫一般對應以下的目錄 C:\Program Files\Microsoft SQL Server Compact Edition\v3.5 ADO.net DLL,而SQL CE 3.0的庫一般對應以下的 目錄 C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile,彼此不 相兼容。由於開發的命名空間(namespace)是一致的,所以開發的程序可以用在不用的SQL CE版本。
helper類
下面演示的是一個SQL CE的helper類,這個類只是針對SQL CE數據庫,沒有考慮移植到其他數據庫, 所以所有的類都使用SQL CE相關的類。
class SqlCeHelper : IDisposable
{
private SqlCeConnection connection;
private SqlCeCommand command;
private const string connectionString = "Data Source=/DB/db.sdf";
#region Open/Close
public void Open()
{
try
{
connection = new SqlCeConnection (connectionString);
command = connection.CreateCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
connection.Open();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
}
public void Close()
{
connection.Close();
connection.Dispose();
}
public void Dispose()
{
connection.Close();
connection.Dispose();
command.Dispose();
}
#endregion
#region Operatons
public SqlCeDataReader ExecuteReader(string sql)
{
command.CommandText = sql;
SqlCeDataReader reader = null;
try
{
reader = command.ExecuteReader();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return reader;
}
public DataSet ExecuteDataSet(string sql)
{
command.CommandText = sql;
SqlCeDataAdapter adapter = new SqlCeDataAdapter (command);
DataSet ds = new DataSet(); ;
try
{
adapter.Fill(ds);
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return ds;
}
public int ExecuteNonQuery(string sql)
{
command.CommandText = sql;
int result = -1;
try
{
result = command.ExecuteNonQuery();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return result;
}
public object ExecuteScalar(string sql)
{
command.CommandText = sql;
object o = null;
try
{
o = command.ExecuteScalar();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return o;
}
#endregion
#region Transaction
public void BeginTransaction()
{
command.Transaction = connection.BeginTransaction();
}
public void CommitTransaction()
{
command.Transaction.Commit();
}
public void RollbackTransaction()
{
command.Transaction.Rollback();
}
#endregion
}
1.建立SQL CE的連接(SqlCeConnection)只需要指定數據庫文件路徑,在這個類,我hardcode了文 件路徑,在實際應用中,可以在構
造函數進行初始化,或者在Open函數中傳遞路徑參數。
2.由於SQL CE當前版本不支持存儲過程,所以SqlCeCommand的CommandType指定為CommandType.Text ,只支持執行SQL語句。
3.實現了通用操作方法ExecuteReader,ExecuteDataSet,ExecuteNonQuery和ExecuteScalar。
4.SQL CE支持事務(Transaction)。
使用
上圖為使用例子的表結構。
SqlCeHelper sqlCe = new SqlCeHelper();
sqlCe.Open();
sqlCe.BeginTransaction();
if (sqlCe.ExecuteNonQuery("delete from t") < 0)
{
sqlCe.RollbackTransaction();
return;
}
if (sqlCe.ExecuteNonQuery("insert into t (f1, f2) values (1, 'abc')") < 0)
{
sqlCe.RollbackTransaction();
return;
}
SqlCeDataReader reader = sqlCe.ExecuteReader("select * from t where f1 = 1");
while (reader.Read())
{
Console.WriteLine("reader: f2:{0}\n", reader["f2"]);
}
if (!reader.IsClosed)
{
reader.Close();
}
if (sqlCe.ExecuteNonQuery("update t set f2 = 'xyz'") < 0)
{
sqlCe.RollbackTransaction();
return;
}
DataSet ds = sqlCe.ExecuteDataSet("select * from t");
foreach (DataRow dr in ds.Tables[0].Rows)
{
Console.WriteLine("dataset: f2:{0}\n", dr["f2"]);
}
sqlCe.CommitTransaction();
sqlCe.Close();
使用這個Helper類很簡單,先生成這個類的實例,打開數據庫連接,使用ExecuteReader和 ExecuteDataSet進行查詢操作,使用ExecuteNonQuery進行增刪改的操作。在操作過程中,同時可以加入 事務處理操作,使用完畢關閉數據庫連接。