移動服務(wù)系統(tǒng)分析與設(shè)計移動服務(wù)系統(tǒng)需求分析移動服務(wù)是應(yīng)用比較廣泛的移動解決方案,其核心是利用移動計算和無線通信技術(shù)為企業(yè)現(xiàn)場服務(wù)人員提供全面、便捷、實時的信息服務(wù)。我們現(xiàn)在就為某電器制造商設(shè)計一套用于售后維修服務(wù)的移動解決方案。 該電器制造商目前售后維修服務(wù)的基本工作流程是:客戶打電話報修,呼叫中心記錄用戶的基本信息(如姓名、地址和電話等等)和客戶對故障的描述信息,生成維修單,維修服務(wù)人員領(lǐng)取維修單,維修服務(wù)人員上門為客戶服務(wù),填寫維修記錄單(如實際故障,維修所用零部件,維修所用時間等),客戶簽字認(rèn)可,維修服務(wù)人員交回維修記錄單,呼叫中心電話回訪客戶。 采用移動服務(wù)系統(tǒng)改造后的工作流程是:客戶打電話報修,呼叫中心記錄用戶的基本信息和客戶對故障的描述信息,生成維修單,維修單通過無線網(wǎng)絡(luò)直接發(fā)送到維修服務(wù)人員的手持設(shè)備上,維修服務(wù)人員上門為客戶服務(wù),在移動設(shè)備上填寫維修記錄單,客戶在移動設(shè)備上簽字認(rèn)可,維修服務(wù)人員把維修記錄單通過無線網(wǎng)絡(luò)發(fā)回至呼叫中心,呼叫中心電話回訪客戶。 通過上述新舊流程的對比,可以發(fā)現(xiàn)采用移動服務(wù)系統(tǒng)之后將顯著的提升維修服務(wù)人員的工作效率,大大縮短客戶報修之后的響應(yīng)時間,對于提升售后服務(wù)的質(zhì)量和客戶滿意度都有極大的益處。 移動服務(wù)系統(tǒng)設(shè)計移動數(shù)據(jù)庫SQL Server CE因為移動服務(wù)系統(tǒng)需要下載維修單到移動設(shè)備上,并在移動設(shè)備上臨時保存維修單,所以在移動設(shè)備上需要有一個數(shù)據(jù)庫系統(tǒng)。我們選擇的移動數(shù)據(jù)庫系統(tǒng)是SQL Server CE。 Microsoft SQL 2000 Windows CE Edition(又稱為SQL Server CE)是用于移動設(shè)備上的小型關(guān)系數(shù)據(jù)庫。SQL Server CE的發(fā)展歷程從1.0開始,當(dāng)時.NET的技術(shù)框架還不能應(yīng)用到移動設(shè)備上,這個時候大家在開發(fā)基于數(shù)據(jù)庫的移動應(yīng)用時,采用的是Embedded Visual Tools 3.0中的VB或VC++,使用OLE DB for SQL Server CE或ADOCE訪問SQL Server CE數(shù)據(jù)庫。隨著.NET Compact Framework的推出,SQL Server CE也推出了2.0,2.0加入了更多的新功能,并在很多性能參數(shù)都有較大的提高,但更重要的是從此可以在Visual Studio .NET中通過ADO.NET訪問SQL Server CE的數(shù)據(jù)庫了。 SQL Server CE與我們熟悉的其他關(guān)系數(shù)據(jù)庫相比,有以下的特點: 1) 打開SQL Server CE數(shù)據(jù)庫時,是通過指定其數(shù)據(jù)庫文件所在的完整路徑來打開的。例如,當(dāng)在EVB中使用ADOCE打開數(shù)據(jù)庫時,可以用下面的形式: Dim cn As ADOCE.Connection 2) SQL Server CE支持?jǐn)?shù)據(jù)庫密碼和數(shù)據(jù)庫文件加密 例如,當(dāng)使用.NET Compact Framework中的SqlCeConnection.Open方法打開數(shù)據(jù)庫時,可以使用如下的連接字符串: "data source=\NorthWind.sdf; password=<myPassword>" 當(dāng)使用ADOCE時,則在連接字符串中必須指定SSCE:Database Password連接屬性。 "Provider=Microsoft.SQLSERVER.OLEDB.CE.2.0; data source=\NorthWind.sdf; SSCE:Database Password=<myPassword>" 3) SQL Server CE同樣支持大量的內(nèi)部函數(shù),這些函數(shù)包括數(shù)學(xué)函數(shù)、字符串函數(shù)和內(nèi)部函數(shù)等。 4) SQL Server CE 2.0 通過 ADO.NET 增加了對參數(shù)化查詢的支持。 例如,我們在構(gòu)造SQL語句時,可以構(gòu)造以下的語句,然后再利用ADO.NET的機(jī)制替換“?”所代表的參數(shù)。對參數(shù)化查詢的支持是 SQL Server CE 2.0的新功能。 "INSERT INTO TableA (col1, col2) VALUES (?, ?)" 5) 與先前版本的SQL Server CE相比,新版本的另一個改進(jìn)是加入了更加可靠的錯誤處理功能。SQL Server CE增加了一個名為SqlCeException的新類,這個類允許您捕捉本機(jī)SQL Server CE錯誤并適當(dāng)?shù)靥幚硭鼈儭?/P> 6) SQL Server CE 2.0提供了兩種基本方法來連接后端SQL Server數(shù)據(jù)庫:RDA和合并復(fù)制。RDA訪問功能支持與SQL Server 7.0(和更高版本)數(shù)據(jù)庫的連接,合并復(fù)制要求后端必須是SQL Server 2000。 數(shù)據(jù)同步設(shè)計移動服務(wù)系統(tǒng)需要下載呼叫中心產(chǎn)生的維修單,也需要把維修服務(wù)人員填寫的維修記錄單上傳到呼叫中心,因此移動服務(wù)系統(tǒng)需要與呼叫中心進(jìn)行雙向的數(shù)據(jù)同步。 SQL Server CE與SQL Server之間可以通過RDA和Replication(合并復(fù)制)兩種方式進(jìn)行數(shù)據(jù)同步。RDA適用于簡單的、不需要全功能的合并復(fù)制功能(例如數(shù)據(jù)沖突處理)的數(shù)據(jù)同步,而Replication則基于Windows Server 2000的合并復(fù)制功能,可以完成更多更復(fù)雜的功能。 RDA全稱是Remote data access,其主要由三部分組成:SQL Server CE數(shù)據(jù)庫引擎、SQL Server CE客戶端代理和SQL Server CE服務(wù)器端代理。SQL Server CE數(shù)據(jù)庫引擎負(fù)責(zé)寫入和讀取SQL Server CE數(shù)據(jù)庫中的數(shù)據(jù);SQL Server CE客戶端代理是RDA在移動設(shè)備上的主要組件,它實現(xiàn)了RDA的主要功能,我們可以通過程序調(diào)用它提供的接口以控制RDA;SQL Server CE服務(wù)器端代理位于服務(wù)器端,它與SQL Server CE客戶端代理通過HTTP協(xié)議進(jìn)行通信,接收并處理SQL Server CE客戶端代理的命令。 RDA支持三個主要的方法,他們分別是:
合并復(fù)制是RDA的一種替代方案,只能與SQL Server 2000配合使用。合并復(fù)制的工作組成與RDA基本類似,但是在服務(wù)器端多了一個SQL Server CE復(fù)制提供程序,也就是說SQL Server CE服務(wù)器端代理通過調(diào)用SQL Server CE復(fù)制提供程序,從SQL Server數(shù)據(jù)庫中選取一個“快照”返回給SQL Server CE客戶端代理,客戶端代理在設(shè)備上建立SQL Server CE的數(shù)據(jù)庫(訂閱數(shù)據(jù)庫)。對訂閱數(shù)據(jù)庫的任何修改都會被SQL Server CE數(shù)據(jù)庫引擎記錄下來,在調(diào)用同步方法時,可以把這些修改作用到后臺SQL Server數(shù)據(jù)庫中。 移動服務(wù)系統(tǒng)在下載維修單時,要滿足兩個基本的條件:一是用戶只能下載分配給自己的維修單;二是只能下載尚沒有完成的維修單。在上傳維修記錄單時,也要滿足兩個基本條件:一是只能上傳客戶已經(jīng)簽名確認(rèn)的維修記錄單;二是只能上傳維修服務(wù)人員選定的維修記錄單。由此可見,移動服務(wù)系統(tǒng)在數(shù)據(jù)同步時,需要實現(xiàn)一定的義務(wù)邏輯規(guī)則,如果用RDA或合并復(fù)制實現(xiàn)這些業(yè)務(wù)邏輯規(guī)則,會比較麻煩一些,所以我們設(shè)計如下的數(shù)據(jù)同步規(guī)則:
開發(fā)準(zhǔn)備工作準(zhǔn)備開發(fā)環(huán)境移動服務(wù)系統(tǒng)采用Visual Studio .NET開發(fā),如果要開發(fā)基于SQL Server CE的應(yīng)用,只需要在項目中添加System.Data.SqlServerCe的引用,在運行和部署時系統(tǒng)會自動安裝兩個SQL Server CE的安裝包文件,他們是sqlce.dev.wce4.armv4.CAB和sqlce.wce4.armv4.CAB(armv4這一項會根據(jù)不同的平臺而有所不同)。sqlce.dev.wce4.armv4.CAB包括Isqlw20.exe和兩個錯誤字符串文件Ssceerror20en.dll和Msdaeren.dll,他們將被安裝到移動設(shè)備的\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在移動設(shè)備上的主要管理工具。
通過查詢分析器,我們可以建立新的SQL Server CE數(shù)據(jù)庫,打開和關(guān)閉數(shù)據(jù)庫,在數(shù)據(jù)庫中建立、刪除和維護(hù)數(shù)據(jù)表,維護(hù)索引信息,可以輸入SQL語句并查看執(zhí)行結(jié)果。 準(zhǔn)備SQL Server CE數(shù)據(jù)庫在開發(fā)中使用的SQL Server CE數(shù)據(jù)庫,可以通過三種方式建立:
其中,通過RDA方式建立是最容易的方法,因為我們可以先行在SQL Server 2000中建立數(shù)據(jù)庫,設(shè)計表結(jié)構(gòu),插入必要的數(shù)據(jù),然后通過RDA一次性的把SQL Server 2000中的表和數(shù)據(jù)下載到移動設(shè)備上。 1) 安裝SQL Server CE 首先安裝SQL Server 2000,安裝完成后,還需要安裝SP3a或者最新的SP4補(bǔ)丁。如果希望通過RDA或合并復(fù)制與SQL Server 2000進(jìn)行數(shù)據(jù)同步,那么還必須下載SQL Server CE的補(bǔ)丁。SQL Server CE的補(bǔ)丁應(yīng)該與SQL Server 2000的補(bǔ)丁是一致的,如果SQL Server 2000的補(bǔ)丁是SP3a,那么需要下載SQL Server CE的SP3a的補(bǔ)丁。 SQL Server CE安裝包、SQL Server CE的SP3a補(bǔ)丁及SQL Server CE的SP4補(bǔ)丁均可在微軟的網(wǎng)站(http://www.microsoft.com/downloads/)下載。 下載完成后,首先安裝SQL Server CE的安裝程序,然后再安裝SQL Server CE的補(bǔ)丁程序。 2) 配置RDA 因為RDA使用HTTP協(xié)議實現(xiàn)數(shù)據(jù)通信,所以服務(wù)器端首先需要安裝并配置好IIS服務(wù)。在“開始”菜單中運行“Configure Connectivity Support in IIS”啟動SQL Server CE連接配置程序。
出現(xiàn)“SQL Server CE Connectivity Management”界面,雙擊“Create a Virtual Directory”打開配置向?qū)?。在圖4的窗口中輸入虛擬目錄的別名。
在圖5的界面中選擇必要的安全設(shè)置,可以按照業(yè)務(wù)的實際需求情況選擇,如果不需要額外安全設(shè)置,可以選擇允許匿名訪問。
設(shè)置完成后,打開瀏覽器,輸入: http://localhost/sqlce/sscesa20.dll 如果以上設(shè)置正確,應(yīng)該可以出現(xiàn)圖6所示的文字:
3) 下載數(shù)據(jù)庫 使用isqlw20.exe查詢分析器程序建立一個空的數(shù)據(jù)庫:MobileService.sdf。 建立空數(shù)據(jù)庫也可以使用下面的代碼建立: if (File.Exists ("\\MobileService.sdf") ) 首先判斷\MobileService.sdf文件是否已經(jīng)存在,如果已經(jīng)存在,則先刪除該文件。在創(chuàng)建數(shù)據(jù)庫時,用的是SqlCeEngine類的CreateDatabase方法,CreateDatabase會根據(jù)LocalConnectionString屬性表示的連接字符串創(chuàng)建SQL Server CE數(shù)據(jù)庫。在連接字符串中的password和encrypt database 屬性是可選項,但是如果使用了encrypt database 屬性則必須包含password屬性。SqlCeEngine類還有一個很重要的方法是Compact,Compact方法用于回收SQL Server CE數(shù)據(jù)庫中浪費的空間,可用于更改SQL Server CE數(shù)據(jù)庫的排列順序、加密方式或密碼。 在Visual Studio .NET中建立一個簡單的移動應(yīng)用程序,執(zhí)行下面的代碼就可以通過RDA的Pull方法在移動設(shè)備上建立JOB表,并下載SQL Server中JOB表的數(shù)據(jù)。通過更換不同的表名稱,就可以循環(huán)下載SQL Server中所有的表。 string rdaOleDbConnectString = "Provider=sqloledb; Data Source=10.1.11.18;Initial Catalog=test; User Id=sa;Password=sa"; 在使用SqlCeRemoteDataAccess訪問RDA時,需要指定三個重要的參數(shù):
另外,如果在服務(wù)器端設(shè)置時需要用戶登錄,還需要設(shè)置InternetLogin屬性和InternetPassword屬性;如果通過代理訪問服務(wù)器,還需要指定相關(guān)的代理屬性。 Pull方法中的第一個參數(shù)是指定的本地表名稱,如果該名稱的表已經(jīng)在SQL Server CE數(shù)據(jù)庫中存在,則該方法會出錯;第四個參數(shù)是設(shè)置是否打開數(shù)據(jù)跟蹤選項的,如果設(shè)置為不打開跟蹤選項,則第二個參數(shù)指定的SQL語句可以從多個表中提取數(shù)據(jù),否則只能從單個表中提取數(shù)據(jù)。因為我們只是要下載數(shù)據(jù),并不打算采用Push方法上傳數(shù)據(jù),所以在此我們可以不指定第四個參數(shù)。 Push方法把SQL Server CE表中的更改傳送回SQL Server表,應(yīng)用程序必須已經(jīng)通過調(diào)用Pull方法并將RdaTrackOption設(shè)置為TrackingOn或TrackingOnWithIndexes創(chuàng)建了SQL Server CE的數(shù)據(jù)表。 SubmitSQL提交在遠(yuǎn)程SQL Server的數(shù)據(jù)庫上執(zhí)行的SQL語句。它所提交的SQL語句必須是不返回任何數(shù)據(jù)行的SQL語句。 開發(fā)移動服務(wù)應(yīng)用程序下載維修單數(shù)據(jù)下載維修單需要兩個參數(shù):當(dāng)前的用戶名和最后一個維修單的時間。先通過查詢數(shù)據(jù)庫得到最后一個維修單的時間。 SqlCeConnection conn = null; 使用SqlCeConnection類Open方法打開SQL Server CE數(shù)據(jù)庫的一個連接。一個SQL Server CE數(shù)據(jù)庫僅能打開一個唯一的連接,所以在使用時要注意試圖打開多個到數(shù)據(jù)庫的連接是不會成功的。但是,多個SQL Server CE的命令可以共享同一個打開的連接。使用Open方法打開的連接不會自動關(guān)閉,所以必須顯式關(guān)閉該連接。 然后使用SqlCeCommand類的ExecuteReader方法執(zhí)行了一條SELECT語句,并將執(zhí)行結(jié)果保存到SqlCeDataReader類中,然后用Read方法讀取該記錄。SELECT語句用到了SQL Server CE的內(nèi)置函數(shù)max,可以得到最大的一個日期。 在使用Read方法讀取記錄時,先使用IsDBNull方法判斷是否為空,如果job表中原本就沒有記錄的話,使用max函數(shù)得到的結(jié)果為空。如果不為空的話,再調(diào)用GetDateTime方法得到結(jié)果集中的DateTime格式的值。 //下載維修單 首先用用戶名和最后的維修單時間構(gòu)造一個URL,然后通過HttpWebRequest類的Create方法打開這個URL,通過HttpWebResponse接收返回的數(shù)據(jù),使用Stream讀取返回流中的數(shù)據(jù)。最后的結(jié)果保存在resultstring變量中。 按照設(shè)計的數(shù)據(jù)同步規(guī)則解析保存在resultstring變量中的記錄和字段(代碼略),然后把記錄寫入SQL Server CE數(shù)據(jù)庫。 //寫入數(shù)據(jù)庫 使用SqlCeCommand類的ExecuteNonQuery方法執(zhí)行不需要返回行記錄的SQL語句。 顯示維修單列表在.NET Compact Framework中仍然支持?jǐn)?shù)據(jù)綁定控件,因此我們在實現(xiàn)維修單列表時,采用DataGrid數(shù)據(jù)綁定列表控件。在窗口中創(chuàng)建DataGrid控件,命名為dataGridJobList,然后在屬性窗口中單擊TableStyles項的“…”圖標(biāo),將出現(xiàn)TableStyles集合編輯器,如圖7所示:
在MappingName中輸入“JOBLIST”,點擊GridColumSytles旁邊的“...”按鈕,設(shè)定數(shù)據(jù)綁定的列映射。在設(shè)定列映射時,添加三列,映射名稱分別是id,jobname,jobtime。如圖8所示:
在Form_load事件中添加數(shù)據(jù)綁定的代碼: //數(shù)據(jù)綁定 通過SqlCeDataAdapter的Fill方法把SQL語句的執(zhí)行結(jié)果填充到DataSet中,取出DataSet中名為“JOBLIST”的DataTable,把DataGrid控件的數(shù)據(jù)源屬性DataSource設(shè)定為名稱為“JOBLIST”的DataTable。通過上述操作就可以完成SQL Server CE數(shù)據(jù)與一個DataGrid控件的數(shù)據(jù)綁定。 編輯并保存維修記錄單當(dāng)點擊列表中的維修單時,將彈出維修記錄編輯界面。在DataGrid的MouseUP事件中添加下列代碼將可以獲取當(dāng)前點擊的是哪一個維修單,并打開維修記錄編輯界面。 DataGrid myGrid = (DataGrid)sender; 在FrmJob的Load事件中添加根據(jù)jobid查詢維修單詳細(xì)信息的代碼,并將查詢結(jié)果顯示在界面上。 string sql ="select jobname,jobdesc,jobtime,userphone,useraddress,jobdonedesc from job where id="+jobid; 編輯完成后,使用SqlCeCommand類的ExecuteNonQuery方法執(zhí)行UPDATE語句更新維修記錄單。 上傳維修記錄單上傳維修記錄單時采用的方法與下載基本相同,需要在后臺服務(wù)器添加一個新的上傳接口。需要注意的是,因為HTTP的GET協(xié)議的URL長度通常是有限制的,所以如果需要上傳的內(nèi)容比較多時,需要考慮用POST協(xié)議。 結(jié)束語本文結(jié)合移動服務(wù)系統(tǒng)的開發(fā)過程介紹了SQL Server CE的特點以及安裝、開發(fā)SQL Server CE應(yīng)用程序的方法,如果需要更全面和詳盡的了解SQL Server CE,可以參閱SQL Server CE附帶的“Books Onlie”。 通過本文的介紹,大家可以看到利用ADO.NET開發(fā)SQL Server CE的應(yīng)用程序,在開發(fā)方法上與在PC平臺上使用ADO.NET非常類似,但總的說來還是要注意一下幾點:
|
|