在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相关的类。
{
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)。
使用
上图为使用例子的表结构。
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进行增删改的操作。在操作过程中,同时可以加入事务处理操作,使用完毕关闭数据库连接。
参考文献
System.Data.SqlServerCe Namespace