Windows Mobile6 Vs2008 Sql Ce3.5 嵌入式应用开发

开发环境:

windows2003,安装了vs2008、SQL Server2005,这是基础(当然用vs2003,vs2005,SQL Server2000啥的也可以,不过新的总是功能强大些么,呵呵);

因为开发时绝大部分时间是在模拟器上调试,而不是PPC,所以模拟器是必须安装的。针对你的PPC操作系统选择对应的模拟器与sdk包,我安装的是WM6中文版的。(windows mobile 6 professional sdk.msi、Windows Mobile 6 Professional Images (CHS).msi);

然后是SQL Server2005 CE的sdk(SQL Server 2005 Compact Edition SDK.msi);

最后是用来管理PPC与电脑通讯的ActiveSync(MicrosoftActiveSync_setup_cn.msi);

以上软件全部可从微软官方网站免费下载。

 

开始新建一个项目:

选择类型,目标平台选择你想要的。后面也可以修改。

程序是在PPC上跑的,到时候会在上面运行SQL Server CE。把dll引用一下。

接着就开始编程!跟普通的.NET程序没有任何区别,就是设计视图跟移动设备一样。下面是登录页面与查询页面。

下面介绍一下SQL Server CE与SQL Server的数据操作问题。网上有很多介绍相关内容的,这里只说重点:

我们的程序在PPC上跑,数据源可能是PPC本地的CE数据文件(.sdf),也可能是远程Server上的SQL Server数据库。如果是本地CE文件,使用System.Data.SqlServerCe命名空间下的几个类:SqlCeConnection(管理连接)、SqlCeCommand(sql命令)、SqlCeDataAdapter(适配器)、SqlCeTransaction(如果你需要使用事务)等即可,与System.Data下的那几个类对应,用法也一样。例如:执行一个SQL:

private SqlCeConnection _Connection = null;

private string _LocalConnectionString = "";

 

public int ExcuteNoneQuery(string strSQL)
        {

            SqlCeCommand command = _Connection.CreateCommand();
            command.CommandText = strSQL;

            int iRows = 0;

            try
            {
                iRows = command.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return iRows;
        }

 

返回一个DataTable:

public DataTable ExeceuteDataTable(string strSQL)
        {
            DataTable dt = new DataTable();

            try
            {
                SqlCeDataAdapter da = new SqlCeDataAdapter(strSQL, _Connection);
                da.Fill(dt);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dt;
        }

 

如过数据源在远程Server上,就要麻烦一点。这是因为微软构建的数据通讯思路是这样的:当你查询数据时,首先需要将SQL Server上的数据下载到本地设备的SQL Server CE数据库里;然后再针对本地数据进行查询。当你想更新数据时,可以更新本地数据后再同步回SQL Server,也可以直接更新SQL Server,视你的业务逻辑需要而定。上述功能是通过System.Data.SqlCeRemoteDataAccess这个类实现的。主要方法有3个:Pull(从远程数据源下载数据到本地ce表。注意一次只能一个表,并且本地ce库中不能存在该表,有的话需先删除)、Push(将ce跟踪的某个表在本地的更改数据同步回server。注意必须在Pull方法中启用跟踪)、SubmitSql(针对远程Server执行一个无返回行的Sql语句,如insert、update、delete)。通讯的原理如下:在PPC上运行着一个客户端代理,在Server上运行着一个服务端代理,2者通过IIS通讯传递数据,也就是说,使用的是Http或Https协议。PPC上应用,调用客户端代理,通过IIS,访问服务端代理;服务端代理再访问SQL Server数据库,通过IIS返回数据给客户端代理,最后客户端再返回给PPC应用。所以,在程序能够正常运行前,配置IIS也是至关重要的一步。

首先Vs会在Program Files/Microsoft SQL Server 2005 Mobile Edition/Server 目录下创建一个与你项目同名的目录。本项目是TestMobile目录。将Server目录下的sqlcesa30.dll拷贝到你的项目目录下。这个文件就是ce的服务端代理。客户端代理就不需要配置了,到部署的时候,vs自动就会安装好,不劳我们动手了。

接着到IIS里设置一下虚拟目录。

设置访问安全验证。如果这里不是匿名访问,则在程序中需配置访问IIS的用户名、密码。

在IE中输入配置的地址,如果配置顺利的话,你将看到如下内容。这表示代理配置成功了:

OK,接着看代码。本项目主要用来查询信息,首先用户登录,登录完毕后可以选择查询车辆信息,或者输入信息立案(业务上的内容就不介绍了)。涉及到的数据库有3部分,1是远程Server上的车辆信息,量大;2是本地ce业务库,放一些标准选项数据,如车牌颜色(蓝、黄、白等)用来提升程序的性能(要知道,频繁的访问远程server的速度很慢。);3是本地ce临时库,用来在查询server上的数据时临时存储在本地。

登录:登录一般是到远程Server中验证(当然你也可以把用户信息放到本地)。登录窗口是项目的起始窗口,在登录时,首先看看临时库有没有,有的话就删除重新创建。

 //加载配置
            Common.GetSettings.LoadConfig();

            if (File.Exists(GetSettings._LocalTmpDbFile))
            {
                File.Delete(GetSettings._LocalTmpDbFile);
            }
            SqlCeEngine engine = new SqlCeEngine("Data Source=" + GetSettings._LocalTmpDbName);
            engine.CreateDatabase();
            engine.Dispose();

接着就是用户身份验证。

/// <summary>
        /// 验证用户身份
        /// </summary>
        /// <param name="strUserCode">登录名</param>
        /// <param name="strUserPass">密码</param>
        /// <returns></returns>
        public UserValid(string strUserCode, string strUserPass)
        {
            string strEncryptWord = Encrypt.Encrypto(strUserPass);
            string strSQL = "select * from TS_User Where UserCode='" + strUserCode + "' And PassWord='" + strEncryptWord + "' And UserState='VALID'";

            DataAccess daTmp = new DataAccess(GetSettings._LocalTmpConnectionString);

            try
            {
                daTmp.PullDataFromRemoteServer("TS_User", strSQL, System.Data.SqlServerCe.RdaTrackOption.TrackingOff);

                daTmp.Open();
                DataTable dt = daTmp.ExeceuteDataTable("TS_User", strSQL);

               if(dt.Rows.Count == 0)
               {
                   IsValidUser = false;
               }
               else
               {
                    UserID = dt.Rows[0]["ID"].ToString();
                    UserName = dt.Rows[0]["UserName"].ToString();
                    UserLawID = dt.Rows[0]["UserLawID"].ToString();
                    UserCode = strUserCode;
                    UserPass = strUserPass;
                    IsValidUser = true;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                daTmp.Close();
            }
        }

这里封装了一个数据访问对象DataAccess,里面就是使用的SqlCeRemoteDataAccess与SqlCeConnection。用来提供数据访问方法,在构造时指定数据库连接,以确定是访问本地临时库,还是本地业务库。因为验证用户是访问server上TS_User表,要临时存储在本地,所以这里使用临时库。可以看到验证过程分为2部分:1是先将数据下载到本地临时库中;2是再从临时库中查询。如果临时库中没有符合的记录,说明验证未通过;反之通过。注意System.Data.SqlServerCe.RdaTrackOption.TrackingOff,表示ce不跟踪对TS_User表的变化,因为我们只是查,不对数据更新。

查询车辆与验证用户身份在数据操作上是一样的,这里略。

再来看看立案处理,需要往server上写数据。

 private void btnLA_Click(object sender, EventArgs e)
        {
            if (!this.ValidData())
                return;

            DataAccess daTmp = new DataAccess("");

            try
            {
                string strSQL = "insert into TJC_PDA (BKTIME,BKPLACE,PTOWNERNAME,PTSEX,PTADDR,PTIDCARD,BKLAWCONT,BKCODE,VEHICLEID,VEHICLEIDCOLOR) ";
                strSQL += "values('" + dtpTime.Value.ToString() + "','" + cmbPlace.Text + "','" + txtName.Text + "','";
                strSQL += cmbSex.Text + "','" + txtAddress.Text + "','" + txtIDCard.Text + "','" + txtLawCNT.Text + "'," + txtLawID.Text + ",'" + txtVehicleID.Text + "','" + cmbVehicleIDColor.Text + "')";
                daTmp.SubmitSql(strSQL);

                MessageBox.Show("立案成功!");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
这里直接操作了远程server上的数据库,故使用SubmitSql方法即可。

抱歉,微软鼓吹的SqlCeRemoteDataAccess同步功能还没用到!!-_-||| 因为业务逻辑不需要嘛,下次用到了在写,很简单的,网上资料一大把。就是将数据先Pull下来,在本地修改,然后Push回去。

说一下SqlCeRemoteDataAccess的几个重要属性:InternetUrl(就是IIS设置的服务端代理的地址,形如:http://ServerIP/TestMobile/sqlcesa30.dll)、InternetLogin、InternetPassword(这2个就与前面IIS身份验证那有关。如果IIS是匿名访问,则这2个属性赋为空即可。)LocalConnectionString(指定ce临时库连接串)、oleDBConnectiongString(指定Server上的数据库连接串)

 

最后来看看调式与部署吧。启动调试,选择对应的模拟器。

选择部署,vs会将相关环境全部部署到模拟器里,如果是PPC的话也一样,包括.net CF、SQL CE CF等。

接着模拟器变开始运行,我们在“工具”-“仿真设备管理器”中将仿真设备管理器调出,点击对应模拟器,右键“插入底座”。

这时模拟器便通过AciveSync与计算机建立了连接。

通过ActiveSync浏览,可以看见程序默认被部署到了模拟器的Program Files目录下。

关于真正部署到PPC:过程与部署到模拟器一样,只是在部署前需要先设置一下PPC的IP,一般127.0.0.1即可;保证PPC通过-ActiveSync与计算机连接通畅;vs中“工具”-“选项”-“设备工具”-“设备”-“Windows CE”-“属性”,将传输改为TCP,并配置使用指定的IP地址,输入你的PPC的IP。接下来就与部署模拟器一样了。

OK,至此基于SQL Server CE的移动应用的基础开发变介绍完毕了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值