关闭

关闭

关闭

封号提示

内容

首页 Pocket PC应用程序中使用SQL Server CE

Pocket PC应用程序中使用SQL Server CE.doc

Pocket PC应用程序中使用SQL Server CE

简单的剪刀鉐头咘 2018-04-16 评分 0 浏览量 0 0 0 0 暂无简介 简介 举报

简介:本文档为《Pocket PC应用程序中使用SQL Server CEdoc》,可适用于IT/计算机领域,主题内容包含PocketPC应用程序中使用SQLServerCEPocketPC应用程序中使用SQLServerCE最近发布的MicrosoftNETCompa符等。

PocketPC应用程序中使用SQLServerCEPocketPC应用程序中使用SQLServerCE最近发布的MicrosoftNETCompactFrameworkbeta版包括了SQLServerCESQLServerCE将SQLServer扩展到windowsCE环境中同时它提供了与桌面应用程序开发相似的的开发环境。在这篇文章中我将初步介绍SQLCE以及如何利用SmartDeviceExtension开发PocketPC上的应用程序。NETCompactFramework体系结构NETCompactFramework(CF)是NETFramework的子集他最主要的优点是与net类库具有相同的灵活性。但是所有NETFramework的类和方法均能在NETCompactFramework(CF)中使用。下图显示了一个移动平台的构成体系。图这个平台允许WindowsCE自携带的应用程序与基于net的应用程序共存。应用程序的宿主(本身也是一个应用程序)用一个公共运行时语言(CRLCommonLanguageRuntime)的实例来管理代码。通过SDE利用NETCompactFramework类库在CRL的顶端开发应用程序。构造一个应用程序样本实例在这个样本实例中将揭示NETCFPocketPC程序设计中要注意的几个方面。我将解释在NETCF中怎样使用WebService怎样使用各种空件以及怎样构件SQLServerCE数据库。这是一个书店的例子例子中书店的售货员使用PocketPC进行查询(在WebSevice中)并在书店中下订单这个订单将被提交给本地的SQLServerCE数据库。WebSeviceWebSevice将使用SQLServer中携带的Pubs数据库这样你就可以很容易的在自己的机器上测试代码。getTitles():ImportsSystemImportsSystemDataImportsSystemDataSqlClientImportsSystemWebServicesPublicClassService:InheritsWebServicePublicFunctiongetTitles(ByValtitleAsString)AsDataSet'MakethedatabaseconnectionDimconnAsNewSqlConnection("server=localhostuid=sa""password=database=Pubs")'CreatetheSQLandsettheparameterDimsqlAsString="SELECT*FROM""titlesWHEREtitleLIKEtitle"DimcommAsNewSqlCommand(sql,conn)commParametersAdd("title",""title"")'CreateadataadapteranddatasetDimdataAdapterAsNewSqlDataAdapter(comm)DimdsAsNewDataSet()'FillthedatasetwiththequeryresultsconnOpen()dataAdapterFill(ds,"titles")connClose()'ReturnthedatasetReturndsEndFunctionEndClassgetTitles()方法获得查询字符串作为输入参数同时返回数据集。使用VisualStudioNET中的SmartDeviceExtension(SDE)在建立WebSevice后我们继续用SDE创建PocketPC的应用程序。我们要开发的这个PocketPC应用程序由一个tab控件和两个tab页组成第一个tab页允许售货员通过书店搜索书籍并向书店下订单第二个tab页则显示书店的订单。图显示了程序重要使用的各种控件这些控件有:labeltextboxbuttoncomboxlistbox和tab等控件:图在form第一次运行的时候首先需要核查PocketPC是否有包含书店信息的数据库如果没有那么就要用SQLServerCE引擎对象创建数据库。由于需要与SQLServerCE建立连接所以必须使用SQLServerCEManagedProvider因此第一件事情是引用SystemDataSqlServerCedll配置和输入相关的名称空间。ImportsSystemDataSqlServerCe图建立数据库后就需要创建表操作表就必须熟悉ADONET类库在这个例子中我们将在SQLServerCEManagedProvider使用类:SqlCeConnection和SqlCeCommand类。'connanddsaredefinedgloballyDimconnAsNewSqlCeConnection("Provider=MicrosoftSQLServerOLEDBCE""DataSource=MyDocumentsBookStoressdf")DimdsAsDataSet'SubcreateStoreDB()'ifdatabasedoesnotexist,createoneIfNotFileExists("MyDocumentsBookStoressdf")ThenDimsqlEngineAsNewEngine("DataSource=""MyDocumentsBookStoressdf")sqlEngineCreateDatabase()DimcmdAsNewSqlCeCommand("CREATETABLEStores(storeIDint""PrimaryKeyNOT,""storeNamenvarchar())",conn)connOpen()cmdExecuteNonQuery()cmdCommandText="CREATETABLEOrders(storeIDint,""titleidnvarchar(),qtyint)"cmdExecuteNonQuery()cmdCommandText="INSERTINTOStores(storeID,""storeName)VALUES(,""'GreatBookStore')"cmdExecuteNonQuery()cmdCommandText="INSERTINTOStores(storeID,""storeName)VALUES(,""'ComputerBookStore')"cmdExecuteNonQuery()connClose()EndIfEndSub在上面的代码中我们创建了两个表:Orders和Store。Orders存储来自售货员的订单Stores存储书店的库存出于方便我已经在Stores中输入了两条纪录。图下一步使用SqlCeDataReader类将书店列表价载入ComboBox控件中。SubLoadStores()connOpen()DimreaderAsSqlCeDataReaderDimcmdAsNewSqlCeCommand("SELECT*FROMStores",conn)reader=cmdExecuteReaderWhilereaderReadcboStoreIDItemsAdd(readerItem("storeID"))EndWhileconnClose()EndSub这样当表单被载入时ComboBox控件就填充了书店列表。图当选中StoreID时就显示他代表的PrivateSubcboStoreIDSelectedIndexChanged(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlescboStoreIDSelectedIndexChangedconnOpen()DimsqlAsString="SELECT*FROMStoresWHEREstoreID="cboStoreIDItems(cboStoreIDSelectedIndex)DimcmdAsNewSqlCeCommand(sql,conn)DimreaderAsSqlCeDataReader=cmdExecuteReaderreaderRead()lblStoreNameText=readerItem("storeName")connClose()EndSub调用WebSevice对于特殊的书籍查询应用程序将调用WebSevice在NETCF中调用WebSevice与在NETFramework中没有什么差别要注意的是WebSevice必须与实际机器上使用的名称相同否则WebSevice将不会工作。下面将WebSevice与ComboBox控件绑定:PrivateSubcmdSearchClick(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlescmdSearchClickDimwsAsNewTitlesWSService()'getthewebserviceds=wsgetTitles(txtSearchText)cboResultDataSource=dsTables()cboResultDisplayMember="title"EndSub实际上当书名被选定后他更多的信息将显示在label控件上。PrivateSubcboResultSelectedIndexChanged(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlescboResultSelectedIndexChanged'displaytheinformationofthe'selectedbookDimrowAsDataRowrow=dsTables("titles")Rows(cboResultSelectedIndex)lblTitleIDText=rowItem("titleid")lblPriceText="$"rowItem("price")txtNotesText=rowItem("notes")EndSub图显然ADD按钮用于增加订单中的数量因此必须给ADD按钮添加一个单击事件:PrivateSubcmdAddClick(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlescmdAddClick'addthetitletothestoresORDERtableconnOpen()DimsqlAsString="INSERTINTOOrders""(storeID,titleid,Qty)VALUES("cboStoreIDItems(cboStoreIDSelectedIndex)",'"lblTitleIDText"',"txtQtyText")"DimcmdAsNewSqlCeCommand(sql,conn)cmdExecuteNonQuery()MsgBox("Titleaddedfor"lblStoreNameText,MsgBoxStyleInformation,"Orders")connClose()EndSub返回消息框证实增加数量。图审核订单点击第二个tab页显示订单点击Refresh按钮第一个ListBox控件将显示订单。PrivateSubcmdRefreshClick(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlescmdRefreshClick'displaysthelistofstoresavailableconnOpen()DimsqlAsString="SELECT*FROMStores"DimcmdAsNewSqlCeCommand(sql,conn)DimreaderAsSqlCeDataReader=cmdExecuteReader'clearsthelistboxcboStoreIDsItemsClear()WhilereaderRead()cboStoreIDsItemsAdd(readerItem("storeID"))EndWhileconnClose()EndSub当一个书店被选中之后该书店相应的订单就会显示在第二个Listbox控件中。PrivateSubcboStoreIDsSelectedIndexChanged(ByValsenderAsSystemObject,ByValeAsSystemEventArgs)HandlescboStoreIDsSelectedIndexChanged'displaystheordersofstoreselectedconnOpen()DimsqlAsString="SELECT*FROMOrdersWHEREstoreID="cboStoreIDsItems(cboStoreIDsSelectedIndex)DimcmdAsNewSqlCeCommand(sql,conn)DimreaderAsSqlCeDataReader=cmdExecuteReader()'clearsthelistboxcboOrdersItemsClear()WhilereaderRead()cboOrdersItemsAdd(readerItem("titleid")""readerItem("qty")"copy(ies)")EndWhileconnClose()EndSub图最后你也许注意到了表单的底部没有虚拟键盘如果使用仿真系统那么这个缺陷就不那么明显但在使用真实设备并准备输入查询条件的时候你会感到很为难不过不用担心我们可以在表单中添加一个菜单条不过在这之后不要忘记将控件的位置作一些调整。使用SQLServer查询分析器SDE毕竟是Beta版他仍然存在一些Bug在测试应用程序的时候遇到的最大的问题是WebSevice没有工作即当点击查询按钮后WebSevice没有响应这时有一个方法可以检测WebSevice是否工作就是Output窗口将显示一些信息以指明那些线程存在。图如果没有这些信息显示那么WebSevice就没有被调用这种情况下简单的终止应用程序然后再重新启动他就可以了。另一个问题是如果你想知道数据表是否被正确的更新了。SQLServer引入了类一个被称为SQLServerCE查询分析器(SQLServerCEQueryAnalyzer)的工具在应用程序第一次引用SQLServerCEManagedProvider时SDE将把相关文件拷贝到目标设备SQLServerCE查询分析器可以通过点击Start>SQLCEQuery(如下图)调用。图要连接SQLServerCE数据库点击显示在底部的绿色箭头和圆柱体。图这时候你可以连接一个已存在的数据库或创建一个新的数据库。下图显示了我们创建的数据库表和域。图要取回表中的数据我们可以在SQL标签下使用SQL语句然后在Grid标签下察看输出结果。图查询分析器的一个好的特征是"按钮预置"按钮预置功能允许你将常用的SQL语句保存起来那么下一次调用的时候你只需要简单的点击一下预设的按钮即可。图重新设置仿真器有些时候查询分析器会拒绝工作这也许只是Beta类产品的自然特性。在很多例子中在仿真器中将软件重新设置即可解决这个问题。一般情况下重新设置软件不会影响数据库但过于频繁的那么就有可能导致找不到保存的数据库这时找回他的唯一方式是在VisualStudioNET中重新编译软件(就像数据库重新创建一样)。打开和关闭连接也许你注意到了应用程序在每一个操作前后均要打开或关闭数据库连接。但我发现在现在的Beta版下当应用还存在的时候连接关闭仿真器将会发生冲突。结论本文讲述了怎样创建使用SDE创建一个调用WebSevice的PocketPC应用程序以及怎样使用SQLServerCE将信息存储在本地设备上同时我们也涉及到了SDE的一些缺陷希望在正是发布的版本中午按能消灭这些Bug。

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +1积分

资料评分:

/16
0下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料