1/422/42刊首语本期的《WindowsPhone应用开发专题》第二季,主题内容是数据库方面的内容。由于大多数数据库的访问方法和步骤以及一些基础知识都是在MSDN上可以获得较为完整的参考内容,因此专题内就不再重复这类内容。从本期开始专题将偏向于资料的整理和收集,并且集合一些自我的创新,思路依旧是公益性质的交流和学习。值得事先声明的是由于部分内容是从网络上转载整理而成,故而我们已经在标题下注明了来源,并表示对作者的感谢。我们保证这些资料的引用都是非商业性质的公益行为,但是如果作者不同意我们的引用,请作者联系我们,我们将删除这些文章的引用。感谢浪剑、自由架构师、MagicBOY和NEWPEILAN积极参与本次专题的制作和资料整理工作。编写组2010.5.173/42目录1、WindowsPhone数据库开发指南2、WindowsMobile上使用WINCE自带数据库3、XMLonWindowsMobileC#4、关于如何在ppc模拟器中读取本地xml文件的办法5、设置Windows窗体DataGridView控件中的数据格式6、移动平台数据库开发心得7、用SQLAnywhere创建WindowsMobile数据库8、用Sybase移动数据库开发CRM系统几个关键问题的技术实现9、智能设备开发环境的配置过程4/42WindowsPhone数据库开发指南移动解决方案系统结构的各个部分正在快速地变为现实,并逐渐融合。更重要的是,许多公司越来越清楚地意识到移动解决方案能够带来很高的效率和新的商业机会。消费者也开始在日常生活中使用各种移动设备。移动设备硬件,特别是各种新式的PocketPC,正在引领时尚潮流,不断满足企业用户和消费者的需要。将各种事物紧密联系的关键是:新的软件和开发工具。在过去几年中,我使用了VisualStudio.NET、SmartDeviceExtensions和SQLServer™CE2.0。将这些软件组件应用到各种PocketPC(如PocketPCPhoneEdition)上,不但提高了开发效率,而且还促进了许多新的移动应用程序的开发。WindowsPhone移动应用数据库开发主要分为在线和离线数据库两种访问方式。从开发角度来说,离线数据库就是本地数据库就是把数据库放在本地,不需要连接网络应用程序就可以访问手机上的数据库中的数据;在线数据库就是在远程机房的应用服务器上搭建系统数据库,手机终端应用程序通过WebService接口来访问远程服务器上的数据。WindowsPhone手机终端数据访问网络拓扑图结构如下:专线路由接入区安全保护区笔记本移动终端无线APN专线无线APN专线PDA终端安全TF卡安全SIM卡防火墙应用服务区USB专用加密卡数字证书USBKEY安全认证管理系统(含RA与认证服务)手机GPRS/CDMA安全接入系统移动应用服务器维护终端手机短消息安全接入系统IP安全接入系统交换机CA数字证书系统运营商APN网络WindowsPhone数据访问链路便携式电脑WindowsPhone手机应用程序在线数据库访问简单说明如下:第一步、在移动应用服务器上安装SQLSERVER或者ORACLE数据库,并创建数据库和表以及添加测试数据等。第二步、开发WebService服务程序,发布并部署至移动应用服务器。第三步、新建WindowsPhone手机应用程序,添加Web引用,调用移动应用服务器上的WebService数据接口在手机终端界面实现对远程数据库服务器上数据的管理功能。WindowsPhone手机应用程序离线数据库主要包括:SQLCE和SQLite。SQLServerCE(SQLCE)是一款轻量级本地数据库引擎,为移动设备上偶尔连接的数据访问提供了解决方案。例如,工商管理人员在执行巡查任务前,可以用WindowsPhone移动设备把台式计算机中的数据库(SQLServer)拷到WindowsPhone的数据库(SQLCE)上;在执行任务时,可以在移动设备上修改记录;完成任务后,可以把移动设备上的数据库上传到台式计算机中的数据库,使这两个数据库之前的数据保持同步。下面用一个简单事例详细讲解下SQLCE的基本步骤://当前应用程序工作目录路径publicstaticstringpath=@\ProgramFiles\soft;//本地数据库连接字符串5/42publicstaticstringSqlceExcue=PersistSecurityInfo=False;DataSource=+path+@\SOFTDB.sdf;password=;//sqlce库路径publicstaticstringSqlceExcueDB=path+@\SOFTDB.sdf;第一步、创建SOFTDB.sdf数据库///summary///生成数据库////summary///returns/returnsprivateboolcreateSqlCeDB(){//确定数据库存在,如果新数据库被建立了就返回true,否则返回false。if(File.Exists(Constant.SqlceExcueDB))File.Delete(Constant.SqlceExcueDB);if(File.Exists(Constant.SqlceExcueDB)==false){SqlCeEngineengine=newSqlCeEngine(Constant.SqlceExcue);engine.CreateDatabase();engine.Dispose();returntrue;}else{returnfalse;}}第二步、创建数据表EMERGENCYINFOStringBuilderTSql=newStringBuilder();TSql.Append(CREATETABLE[EMERGENCYINFO]();TSql.Append([ID][numeric](20,0)NOTNULL,);TSql.Append([EMGID][nchar](20)NULL,);TSql.Append([OCCURTIME][nchar](20)NULL,);TSql.Append([EXPLAIN][nchar](300)NULL,);TSql.Append([TYPENAME][nchar](2)NULL,);TSql.Append([REPORTGJJ][nchar](2)NULL,);TSql.Append([REPORTSJJB][nchar](2)NULL);TSql.Append());SqlCeConnectionconn=newSqlCeConnection(Constant.SqlceExcue);try{conn.Open();SqlCeCommandsqlCreateTable=conn.CreateCommand();sqlCreateTable.CommandText=TSql.ToString();sqlCreateTable.ExecuteNonQuery();}catch(SqlCeExceptionExte){}finally{conn.Close();}第三步、往表EMERGENCYINFO插入数据要把远程服务器的数据推送到手机终端方式很多,为了能够更多元化的实现数据同步功能,6/42这里采用WebService数据接口直接从远程服务器获取SQLSERVER或者ORACLE数据库的数据集。///summary///读取指定服务器上的数据库数据////summary///paramname=tableName/param///returnsDataSet/returnsprivateDataSetgetDataSet(stringtableName){stringstrSql=;DataSetdst=newDataSet();try{MPP.WebServicemws=newMPP.WebService();mws.Url=Constant.GetWebUrl;strSql=select*from+tableName;dst=mws.QueryData(strSql,Constant.oracleConnString);}catch{}returndst;}//拼插入语句:ArrayListarr=newArrayList();stringvals=;arr.Add(ID,EMGID,OCCURTIME,EXPLAIN,TYPENAME,REPORTGJJ,REPORTSJJB);vals=dr[ID].ToString()+,'+dr[EMGID].ToString()+','+dr[OCCURTIME].ToString()+','+dr[EXPLAIN].ToString()+','+dr[TYPENAME].ToString()+','+dr[REPORTGJJ].ToString()+','+dr[REPORTSJJB].ToString()+';arr.Add(vals);//执行新增操作DataTabledt=dst.Tables[0];if(dt.Rows.Count==0)return;SqlCeConnectionconn=newSqlCeConnection(Constant.SqlceExcue);try{conn.Open();conn.BeginTransaction();SqlCeCommandsqlCreateTable=conn.CreateCommand();//导入数据for(intj=0;jdt.Rows.Count;j++){stringinssql=insertinto+tname+(+arr[0].ToString()+)values(+arr[1].ToString()+);sqlCreateTable.CommandText=inssql;sqlCreateTable.ExecuteNonQuery();}}catch(Exceptionex){}finally7/42{conn.Close();}第四步、SQLCE数据库的简单操作语句///summary///执行SQLCE查询,返回DataSet////summary///paramname=SQLSQL语句/param///returnsdsDataSet对象./returnspublicstaticDataSetGetDataSet(stringsql){using(DataSetdt=newDataSet()){SqlCeConnectionconn=newSqlCeConnection(Constant.SqlceExcue);try{SqlCeCommandcmd=newSqlCeCommand(sql,conn);SqlCeDataAdapteradptr=newSqlCeDataAdapter(cmd);adptr.Fill(dt);cmd.Dispose();}catch(SqlCeExceptionet){}finally{conn.Close();}returndt;}}///summary///执行SQLCE的SQL语句,返回是否成功////summary///paramname=SQLSQL语句/param///returnsdsbool对象./returnspublicstaticboolExeSqlCe(stringsqlString){boolresult=false;SqlCeConnectionssceconn=newSqlCeConnection(Constant.SqlceExcue);try{ssceconn.Open();SqlCeCommandsqlInsertRow=ssceconn.CreateCommand();sqlInsertRow.Command