在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

本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/04/08/1431361.html,如需转载请自行联系原作者

.NET Compact Framework下SQL CE的使用相关推荐

  1. .NET Compact Framework下的单元测试

    在 Wince和Windows Mobile下native C++的单元测试 里讲述了在Wince和Windows Mobile下native C++进行单元测试的方法,这篇将会讲述.NET Comp ...

  2. Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发...

    简介 本文讲述了.NET Compact Framework下的注册表开发的基本概念,介绍在Windows Mobile和Wince下操作注册表的工具,同时使用C#实现了一个注册表导出工具. 背景 W ...

  3. .NET Compact Framework下的蓝牙开发

    蓝牙的应用十分广泛,基于Bluetooth的通信程序开发主要有以下几个步骤: 服务端 * 设置本设备为可发现. * 公开服务给其他Bluetooth设备访问. * 接受其他Bluetooth设备的链接 ...

  4. .NET Compact Framework下的进程间通信之Windows Message

    在Wince和Windows Moblie 下的进程间通信可以由以下几种技术实现. 1. Windows Message 2. Point-to-Point Message Queues 3. MSM ...

  5. .NET Compact Framework下的串口通信

    在Wince和Windows Mobile下,很多设备以串口(Serial Port/Com Port)的方式提供访问接口,例如可以通过串口访问GPS的receiver,从而接收NMEA Data. ...

  6. 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序...

    在.NET Compact Framework 的进程管理需要调用win32的API,也就是P/Invoke,在msnd上提供了这一P/Invoke的源代码, Creating a Microsoft ...

  7. .NET Compact Framework 多线程下的等待事件

    在WinCE或者Windows Moblie开发中常常把大量的批处理工作提交给工作进程(Worker Thread)进行,当批处理工作完成时,或者该进程发生失败以及异常的时候需要通知界面进程(UI T ...

  8. Microsoft .NET Compact Framework 开发常见问题解答

    这个 FAQ 有部分是通过编辑公共 .NET Compact Framework 新闻组 (microsoft.public.dotnet.framework.compactframework) 贴出 ...

  9. SQL CE 3.0 与SQL CE 3.5区别

        在.NET Campact Framework常用SQL CE数据库进行数据存储,SQL CE是一个扩展名为*.sdf的文件数据库,曾经命名为SQL Server for Windows CE ...

最新文章

  1. 计算机主板风扇安装,5个装机注意事项 让你装电脑少走弯路
  2. ASP.NETmvc常用JQUERY收藏【jquery.form.js结合jquery.validate.js】
  3. signature=f2388c4f1bce538cc797410d9560f03b,KSHV strategies for host dsDNA sensing machinery
  4. 高等数学上-赵立军-北京大学出版社-题解-练习5.5
  5. [转载] Visual Studio 2017 VC项目设置 printf 输出到 Console 窗口调试
  6. Unity DoTween
  7. CTF训练(密码学)——位移密码
  8. VMware 笔试题目:猫和老鼠玩象棋
  9. iOS编程------SQLite / 数据库
  10. Top-down Visual Saliency Guided by Captions阅读笔记
  11. Linux 实用指令 -- 网络配置(查看网络IP和网关、 ping 测试主机之间网络连通、Linux网络环境配置(指定固定ip))
  12. 基于android的宠物救助站app
  13. Kotlin骚气写法 三
  14. 越狱剧《青盲》观感之“自作孽不可活”
  15. Unity3d代码及效率优化总结
  16. java给定n和随机数输出素数_输出所有质数因子java
  17. 携创教育:自考英语二可以不考吗?与英语四级哪个更难?
  18. win7电脑台式机如何调整屏幕亮度
  19. java中级面试要求
  20. 什么是骨传导耳机?骨传导耳机对比一般耳机优势在哪?

热门文章

  1. HTML fieldset 标签 -- 表单分组
  2. 高房价可控制人口增长与人口素质?
  3. 职场思想分享002 | 入职第一个月工资这样花,一年内工资至少再涨50%!
  4. Python最简编码规范
  5. 表格行与列边框样式处理的原理分析及实战应用
  6. EBS R12.2 ADOP (R12.2 AD Online Patching) - 1
  7. 《Spring 5 官方文档》18. Web MVC 框架(五)
  8. Java-函数式编程(二)Lambda表达式
  9. 第四章 .net core做一个简单的登录
  10. Python的lambda表达式