.NET Compact Framework下SQL CE的使用

在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进行增删改的操作。在操作过程中,同时可以加入事务处理操作,使用完毕关闭数据库连接。

参考文献

System.Data.SqlServerCe Namespace


 

posted @ 2009-04-08 09:42  Jake Lin  阅读(5013)  评论(16编辑  收藏  举报