VS2008下开发Sql CE2.0应用程序

来源:互联网 发布:淘宝店铺不支持花呗 编辑:程序博客网 时间:2024/06/05 00:59

Microsoft SQL 2000 Windows CE Edition(又称为SQL Server CE)是用于移动设备上的小型关系数据库。SQL Server CE的发展历程从1.0开始,当时.NET的技术框架还不能应用到移动设备上,这个时候大家在开发基于数据库的移动应用时,采用的是Embedded Visual Tools 3.0中的VB或VC++,使用OLE DB for SQL Server CE或ADOCE访问SQL Server CE数据库。随着.NET Compact Framework的推出,SQL Server CE也推出了2.0,2.0加入了更多的新功能,并在很多性能参数都有较大的提高,但更重要的是从此可以在Visual Studio .NET中通过ADO.NET访问SQL Server CE的数据库了。
    SQL Server CE 2.0提供了两种基本方法来连接后端SQL Server数据库:RDA和合并复制。RDA访问功能支持与SQL Server 7.0(和更高版本)数据库的连接,合并复制要求后端必须是SQL Server 2000。
    SQL Server CE与SQL Server之间可以通过RDA和Replication(合并复制)两种方式进行数据同步。RDA适用于简单的、不需要全功能的合并复制功能(例如数据冲突处理)的数据同步,而Replication则基于Windows Server 2000的合并复制功能,可以完成更多更复杂的功能。
  RDA全称是Remote data access,其主要由三部分组成:SQL Server CE数据库引擎、SQL Server CE客户端代理和SQL Server CE服务器端代理。SQL Server CE数据库引擎负责写入和读取SQL Server CE数据库中的数据;SQL Server CE客户端代理是RDA在移动设备上的主要组件,它实现了RDA的主要功能,我们可以通过程序调用它提供的接口以控制RDA;SQL Server CE服务器端代理位于服务器端,它与SQL Server CE客户端代理通过HTTP协议进行通信,接收并处理SQL Server CE客户端代理的命令。
  RDA支持三个主要的方法,他们分别是:
    Pull
    将SQL Server 2000数据库中的表“拉”到SQL Server CE中。在调用此方法时,可以设置数据跟踪选项,如果设置数据跟踪,则SQL Server CE数据库引擎会自动跟踪对数据的插入、修改和删除操作。
    Push
    如果在Pull时设置了数据跟踪选项,可以将SQL Server CE中的数据“推”回到SQL Server 2000中。在SQL Server CE中对数据的任何修改都会反映到SQL Server 2000中。
    SubmitSQL
    直接向SQL Server 2000数据库提交一个命令。
    如下图所示:
 VS2008下开发Sql <wbr>CE2.0应用程序


    合并复制是RDA的一种替代方案,只能与SQL Server 2000配合使用。合并复制的工作组成与RDA基本类似,但是在服务器端多了一个SQL Server CE复制提供程序,也就是说SQL Server CE服务器端代理通过调用SQL Server CE复制提供程序,从SQL Server数据库中选取一个“快照”返回给SQL Server CE客户端代理,客户端代理在设备上建立SQL Server CE的数据库(订阅数据库)。对订阅数据库的任何修改都会被SQL Server CE数据库引擎记录下来,在调用同步方法时,可以把这些修改作用到后台SQL Server数据库中。
    准备开发环境
  移动服务系统采用Visual Studio .NET开发,如果要开发基于SQL Server CE的应用,只需要在项目中添加System.Data.SqlServerCe的引用,在运行和部署时系统会自动安装两个SQL Server CE的安装包文件,他们是sqlce.dev.wce4.armv4.CAB和sqlce.wce4.armv4.CAB(armv4这一项会根据不同的平台而有所不同)。sqlce.dev.wce4.armv4.CAB包括Isqlw20.exe和两个错误字符串文件Ssceerror20en.dll和Msdaeren.dll,他们将被安装到移动设备的\Program Files\SQLCE 2.0目录;sqlce.wce4.armv4.CAB包括将被安装到\Program Files\SQLCE 2.0目录下的Ssce20.dll、Ssceca20.dll和安装到\windows目录下的Sscemw20.dll。
  isqlw20.exe是SQL Server CE的查询分析器程序,是SQL Server CE在移动设备上的主要管理工具。
 VS2008下开发Sql <wbr>CE2.0应用程序
    通过查询分析器,我们可以建立新的SQL Server CE数据库,打开和关闭数据库,在数据库中建立、删除和维护数据表,维护索引信息,可以输入SQL语句并查看执行结果。
    准备SQL Server CE数据库
  在开发中使用的SQL Server CE数据库,可以通过三种方式建立:
    通过isqlw20.exe查询分析器程序建立;
    通过编写程序建立数据库,建立表,插入必要的数据;
    通过RDA或合并复制建立。
  其中,通过RDA方式建立是最容易的方法,因为我们可以先行在SQL Server 2000中建立数据库,设计表结构,插入必要的数据,然后通过RDA一次性的把SQL Server 2000中的表和数据下载到移动设备上。
    1) 安装SQL Server CE
  首先安装SQL Server 2000,安装完成后,还需要安装SP3a或者最新的SP4补丁。如果希望通过RDA或合并复制与SQL Server 2000进行数据同步,那么还必须下载SQL Server CE的补丁。SQL Server CE的补丁应该与SQL Server 2000的补丁是一致的,如果SQL Server 2000的补丁是SP3a,那么需要下载SQL Server CE的SP3a的补丁。 SQL Server CE安装包、SQL Server CE的SP3a补丁及SQL Server CE的SP4补丁均可在微软的网站下载(http://www.microsoft.com/downloads/)。
  下载完成后,首先安装SQL Server CE的安装程序,然后再安装SQL Server CE的补丁程序。
  2) 配置RDA
  因为RDA使用HTTP协议实现数据通信,所以服务器端首先需要安装并配置好IIS服务。在“开始”-->所有程序-->Microsoft SQL Server CE2.0-->Configure Connectivity Support in IIS启动SQL Server CE连接配置程序。
 VS2008下开发Sql <wbr>CE2.0应用程序
    出现“SQL Server CE Connectivity Management”界面,双击“Create a Virtual Directory”打开配置向导。在窗口中输入虚拟目录的别名。
 VS2008下开发Sql <wbr>CE2.0应用程序
    在界面中选择必要的安全设置,可以按照业务的实际需求情况选择,如果不需要额外安全设置,可以选择允许匿名访问。
 
    设置完成后,打开浏览器,输入:http://localhost/sqlce/sscesa20.dll ,  如果以上设置正确,应该可以出现下图所示的文字:

VS2008下开发Sql <wbr>CE2.0应用程序
 VS2008下开发Sql <wbr>CE2.0应用程序
    3) 下载数据库
  使用isqlw20.exe查询分析器程序建立一个空的数据库:MobileService.sdf。
  建立空数据库也可以使用下面的代码建立:
    ......
    public string LocalDatabase = "\\My Documents\\MobileService.sdf";
    ......
    if (File.Exists(LocalDatabase))
          File.Delete(LocalDatabase);
    try
    {
          SqlCeEngine engine = new SqlCeEngine("Data Source = "+LocalDatabase
                +";password=test;encrypt database=TRUE");
          engine.CreateDatabase();
          engine.Dispose();
          MessageBox.Show("ok");
     }
     catch (Exception ex)
     {
          MessageBox.Show(ex.ToString());
     }
  首先判断\MobileService.sdf文件是否已经存在,如果已经存在,则先删除该文件。在创建数据库时,用的是SqlCeEngine类的CreateDatabase方法,CreateDatabase会根据LocalConnectionString属性表示的连接字符串创建SQL Server CE数据库。在连接字符串中的password和encrypt database 属性是可选项,但是如果使用了encrypt database 属性则必须包含password属性。SqlCeEngine类还有一个很重要的方法是Compact,Compact方法用于回收SQL Server CE数据库中浪费的空间,可用于更改SQL Server CE数据库的排列顺序、加密方式或密码。
    需要注意的是,新建VS2008移动设备工程(如Mobile 5.0 Pocket PC模拟器)时,可以先不加任何功能代码,仅添加引用System.data.SqlServerCe,编译运行,系统会自动向模拟器加载需要的DLL模块,并放在模拟器
\Program Files\Microsoft SQL Server Compact Edition\v3.5中。可以通过开始-->所有程序-->VS2008-->
Visual Studio Remote Tools-->远程文件查看器查看,数据库查询分析器isqlw35.exe文件也在该目录的CN路径下。
 VS2008下开发Sql <wbr>CE2.0应用程序
 VS2008下开发Sql <wbr>CE2.0应用程序
    在点击×号退出模拟器时,选择保存当前状态,就可以不必每次编译程序都重新加载DLL文件了。如果想在虚拟器中删除工程文件,可以在远程文件查看器中删除,但必须先使用远程进程查看器删除工程文件进程。删除数据库文件也是一样,先要在远程进程查看器中删除isqlw35.exe,因为要删除的文件正在被使用。
    实验pull方法:
    在上面按钮点击事件处理方法中添加以下代码,实现从桌面Northwind数据库向设备模拟器本地数据库MobileService.sdf下载数据表结构及数据记录:
    string rdaOleDbConnectString = "Provider=sqloledb.1;Data Source=192.168.1.17;
               Initial Catalog=Northwind; User Id=sa;Password=sa";
    SqlCeRemoteDataAccess rda = null;
    rda = new SqlCeRemoteDataAccess();
    //rda.InternetLogin = "MyLogin";
    //rda.InternetPassword = "<password>";
    rda.InternetUrl = "http://192.168.1.17/sqlce/sscesa20.dll";
    rda.LocalConnectionString = @"Data Source=\My Documents\MobileService.sdf;password=test";
    rda.Pull("Region", "Select * from Region", rdaOleDbConnectString);
    在使用SqlCeRemoteDataAccess访问RDA时,需要指定三个重要的参数:
    SQL Server CE服务器端代理的访问地址,通过SqlCeRemoteDataAccess类的InternetUrl属性指定;
    连接到SQL Server CE数据库的连接字符串,通过SqlCeRemoteDataAccess类的LocalConnectionString 属性指定;
    SQL Server CE服务器端代理访问SQL数据库的连接字符串,通过调用Pull、Push或Submit方法时指定。
  另外,如果在服务器端设置时需要用户登录,还需要设置InternetLogin属性和InternetPassword属性;如果通过代理访问服务器,还需要指定相关的代理属性。
  Pull方法中的第一个参数是指定的本地表名称,如果该名称的表已经在SQL Server CE数据库中存在,则该方法会出错;第四个参数是设置是否打开数据跟踪选项的,如果设置为不打开跟踪选项,则第二个参数指定的SQL语句可以从多个表中提取数据,否则只能从单个表中提取数据。因为我们只是要下载数据,并不打算采用Push方法上传数据,所以在此我们可以不指定第四个参数。
    编译运行程序,在模拟器中提示错误“将数据发送到运行IIS的计算机的请求失败.有关详细信息请参阅HRESULT”。网上有一些解决办法,包括关闭防火墙等,但都无法解决。分析是网络连接问题,试着在模拟器的浏览器中使用http://192.168.1.17/sqlce/sscesa20.dll连接IIS,或者浏览百度等网页,未成功,提示未配置网络连接。后根据网上相关文章,执行了以下连接配置操作:
    在确保主机已连上互联网的情况下,按以下步骤设置:
    1、打开ActiveSync ,点击“文件”——>“连接设置”,在“允许连接到以下其中一个端口”下选择“DMA”。
    2、打开 VS2005,点击菜单“工具”——>“设备仿真管理器”,选择一个 PocketPC SE 2003模拟器(或其它模拟器,但编译时应选择相同模拟器)。在右键菜单中点击“连接”。等模拟器启动后,再点击“插入底座”,此时,通过ActiveSync来连接到模拟器,并进行数据同步。
    3、在模拟器中,点击“开始”——>“设置”,点击“连接”选项卡。
   (1)选择“网卡”:
    “我的网卡连接到”选“默认单位设置”。
     在“点击适配器以修改设置:”下面选“AsyncMac NDISWAN Miniport”,选中“使用服务器分配的IP地址”,点击右上角的“ok”,提示“新设置将在下次使用适配器时应用。如果适配器当前插在设备中,请先移除,然后重新插入适配器以应用设置。”,点击“ok”,“ok”。
    (2)在“连接”选项卡中选择“连接”:
     在“高级”选项卡中,点击“选择网络”,在“在程序自动连接到Internet时,使用:”下面选“单位设置”,默认是“Internet设置”,然后,连续点击右上角的“ok”,“ok”,“X”返回。
    4、此时,就可以上网了。依次点击“开始”——>“Internet Explorer”,输入WWW.BAIDU.COM等就会出现页面了。如还打不开网页,可在“设备仿真器管理器”中选中该模拟器,先点击右键菜单中的“移除底座”,再点击“插入底座”,重新与ActiveSync连接一次(或在ActiveSync连接配置中执行连接操作),就没问题了。
    连接配置好后,在模拟器的Program中再打开工程,点击按钮,执行上述数据库操作,提示“内部错误:传输消息的HTTP标头信息已坏”错误,检查代码无错误,借鉴网上相关文章,分析是SqlServerCe.dll的版本问题,VS2008默认添加的是C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices下3.5版本的System.Data.SqlServerCe.dll文件。
    为解决这个问题,在其它机器中安装了VS2005,从目录D:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile\v2.0中得到2.0版本的System.Data.SqlServerCe.dll文件。重新添加引用,再编译运行,提示:无法找到PInvoke DLL "sscemw20.dll"错误,分析是模拟器中sql ce执行环境(如下图所示)版本不一致的原因。
 
    如图所示,DLL文件和查询分析文件均为3.5版本(对应的DLL文件可以在C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i或其它设备类型目录下找到)。查找sqlce联机文档,sqlce2.0所需dll环境包括ssce20.dll、ssceca20.dll、ssceerror20en.dll、isqlw20.exe这几个Sql Server Ce文件(可以从CE2.0安装目录C:\Program Files\Microsoft SQL Server CE 2.0\Device\Arm\Sa1100中得到,包括dllregister.exe文件--可以在移动设备中用于注册dll文件);还有安装ce2.0的server tools时C:\Windows CE Tools\wce300\Pocket PC 2002\dataaccess31\target\arm目录下的adoce31.dll、adoceoledb31.dll、adoxce31.dll、msdaeren.dll这几个文件。
    在远程文件查看器中(使用工具栏中的方向向上的上箭头)将这些文件都下载到移动设备的windows目录下。
    在远程文件查看器中,从C:\Program Files\Microsoft SQL Server CE 2.0\Device\Arm\Sa1100下将dll文件注册器dllregister.exe复制到移动设备的Windows目录下。
    在移动设备(模拟器)中选择“开始-->资源管理器-->windows”,点击运行dllregister,注册成功。测试证明这些DLL文件及注册器都是cpu类型相关的,如这里的arm。如果注册不成功,可以选择其它类型的相关文件再试一下。
    注册之后,再试,显示错误:无法找到 PInvoke DLL“sscemw20.dll”。按照前述方法,使用ActiveSync连接,错误依旧。按照下图,在远程文件查看器中手工搭建DLL环境,再试,还是不能解决。
VS2008下开发Sql <wbr>CE2.0应用程序 
    以上测试使用Mobile5.0 Pocket PC R2 Square Emulator模拟器,怀疑是因为模拟器中保存的DLL版本冲突,又使用Mobile5.0 Pocket PC R2 Square Emulator模拟器(相当于使用了一台新设备)试了一下,仍然显示该异常。看来主要是因为VS2008与VS2005不同,缺少对SQL CE2.0的支持。不像VS2005,安装后就有对CE2.0的兼容支持,不知在CE2.0已安装的情况下,重装VS2008会不会添加对CE2.0的支持。
    稍感欣慰的是在vs2005环境下测试成功。请有兴趣的同行也在VS2008下试一下,共同解决这一问题。
    刚接触嵌入式,感觉开发上与桌面类似,不过环境搭建太啰嗦了,而且兼容性不好。不过,现在的软件开发大多是集成和搭建,真希望这方面的高手多共享一下经验,共同提高。
 
    问题解决:
    在前面测试的基础上,利用VS2005程序(参考VS2005下的Sql CE开发测试)运行时在模拟器Windows目录下部署的sscemw20.dll文件。
    首先在VS2005远程文件查看工具中导出sscemw20.dll,再在VS2008远程文件查看工具中导入sscemw20.dll,运行dllregister注册一下,保存状态并退出模拟器,再次编译并测试程序,运行成功。
    这一次的测试是在另一台机器上,由于先安装的SQL2005,又安装的SQL2000,在安装SQL2000时默认实例名选项是不可选的,所以创建的实例名为MYSQL(机器名为XH)。按钮点击事件处理方法代码如下:
    if (File.Exists(LocalDatabase))
                File.Delete(LocalDatabase);
            try
            {
                SqlCeEngine engine = new SqlCeEngine("Data Source = " + LocalDatabase
                      + ";password=test;encrypt database=TRUE");
                engine.CreateDatabase();
                engine.Dispose();
                //或者Data Source=(local)\\MYSQL
                string rdaOleDbConnectString = "Provider=sqloledb.1;Data Source=XH\\MYSQL;
                      Initial Catalog=Northwind; User Id=sa;Password=sa";
                SqlCeRemoteDataAccess rda = null;
                rda = new SqlCeRemoteDataAccess();
                //rda.InternetLogin = "MyLogin";
                //rda.InternetPassword = "<password>";
                rda.InternetUrl = "http://192.168.2.22/sqlce/sscesa20.dll";
                rda.LocalConnectionString
                         = @"Data Source=\My Documents\MobileService.sdf;password=test";
                rda.Pull("Region", "Select * from Region", rdaOleDbConnectString);
                MessageBox.Show("ok");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
 

 


原创粉丝点击