Windows Phone 7 取得 WCF 資料服務
假如要寫一支 Winodws Mobile 6.5 應用程式去存取SQL 資料庫,很簡單的參考System.Data.SqlClient所提供的函式就可以上手了,可是現在新版的Windows Phone 7的應用程式使用的.net CF 3.7 架構有很多的函式都不在支援了那要存取資料庫怎麼辦?所以今天我就要來分享一下使用WCF Data Services 技術來連結資料庫之前稱為 "ADO.NET Data Services"。那我們今天所要使用的測試資庫就是他了北風資料庫因該大家都認識吧,不管你是sql2000、2005、2008 都可以去下載http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en安裝
1.建立WCF Data Services
1.1開啟vs2010 選擇自已的程式語言在範本窗格選取WCF服務應用程式範本
1.2在方案總管中,以滑鼠右鍵按一下WCF專案名稱,然後按一下加入新項目選取 ADO.NET 實體資料模型。
1.3在實體資料模型精靈中,選取 從資料庫產生,然後按下一步
1.4如果尚未設定資料庫連接,請按一下新增連接,然後建立新的連接。
1.5將資料模型連接至資料庫,然後按一下下一步
1.6在精靈的最後一頁上,選取資料庫中所有資料表的核取方塊,並且清除檢視表和預存程序的核取方塊,按一下完成關閉精靈
1.7在方案總管中,以滑鼠右鍵按一下WCF專案名稱,然後按一下加入新項目點選範本視窗WCF資料服務
1.8把程式碼裡 Inherits DataService(Of [[class name]]) 改成
Inherits DataService(Of NorthwindEntities),在InitializeService 函式中新增一段config.SetEntitySetAccessRule("Employees", EntitySetRights.All)
1.9在方案總管中,以滑鼠右鍵按一下WCF資料服務.SVC,然後按一下在瀏覽器中檢視看看WCF是否執行正常
1.10整個WCF建立完成後就可以來加入Windows Phone 應用程式,假設如果沒有架設sql server 或是wcf也不想架沒關係給大家一個可以測試的WCF網址http://services.odata.org/Northwind/Northwind.svc/這網站也是使用北風資料庫
2.建立Windows Phone 應用程式
2.1在上vs2010上方功能目錄點選檔案\加入\新增專案,在來挑選範本視窗下Windows Phone Application建立此專案
2.2在方案總管中,以滑鼠右鍵按一下Windows Phonbe 專案名稱,然後按一下加入服務參考,可以在畫面中按一下探索或是貼上網垃來找出服務清單,可是在這裡Windows Phone 好像沒辦法享用此工具產生將物件繫結至控制項所需的程式碼,怎麼辦呢只好採用手動方式
2.3開啟cmd 來下指令執行 DataSvcUtil 這支工具安裝在C:\Windows\Microsoft.NET\Framework\v4.0.30319,您也可以從 Visual Studio 命令提示字元 (按一下開始,指向所有程式、指向Microsoft Visual Studio 2010、指向Visual Studio Tools,然後按一下Visual Studio 2010 命令提示字元),存取 DataSvcUtil.exe 工具。接在我們來手工產生用戶端應用程式存取資料服務所需的用戶端資料服務類別DataSvcUtil.exe /language:CSharp /out:C:\Temp\Northwind.cs /uri:http://localhost:1504/Northwind.svc
/language 指定所產生之原始程式碼檔案的語言。預設語言為 C#。
/out 指定原始程式碼檔案的名稱,該檔案包含已產生的用戶端資料服務類別。
/uri OData 摘要的 URI
如果要更了解此工具的用法可以看一下http://msdn.microsoft.com/zh-tw/library/ee383989.aspx
2.4在方案總管中,以滑鼠右鍵按一下Windows Phone專案名稱,然後按一下加入現有項目選取剛才所產生的用戶端資料服務類別 Northwind.cs
2.5WCF Data Services 會使用 OData 通訊協定來定址及更新資源,所以Windows Phone也有專用的函式 OData Client Library for Windows Phone 7下載位置 http://www.microsoft.com/downloads/details.aspx?FamilyID=b251b247-70ca-4887-bab6-dccdec192f8d&displaylang=en此檔案下載至本電腦後把他解壓縮出來就可以使用不用安裝。
2.6在Windows Phone U I 只提供Grid Control 必需要自已layout 可是如果想要傳統的DataGrid Control是不供提,不過在Silverlight網站提供sample可以來使用一下 http://www.silverlightshow.net/items/Building-a-DataGrid-Control-for-Silverlight-for-Windows-Phone-Part-1.aspx把他的sample 下載回來解壓縮取得裡面PhoneDataGrid 專案
2.7在上vs2010上方功能目錄點選檔案\加入\現有專案,把剛才所解壓縮的專案加入進來,接著在方案總管中,以滑鼠右鍵按一下Windows Phone專案名稱,然後按一下加入參考點選專案,這樣子Windows Phone 就可以來使用DataGrid Control ,可是加進來後先建置一下專案看看是否有無問題。
2.8接著我們可以從工具箱拖拉DataGrid、DataPager這二個物件到MainPage畫面上,或是用下列程式碼帶入
在 StackPanel 加入
<my:DataPager x:Name="dgPager" PageSize="6" DisplayMode="Numeric"
Background="Blue" HorizontalAlignment="Left" />
在 Grid 加入
<my:DataGrid x:Name="dgPhone" AutoGenerateColumns="True"
Background="Blue" AlternatingRowBackground="Blue"
RowBackground="Blue" GridLinesVisibility="All"
VerticalScrollBarVisibility="Auto" Margin="1"
HeadersVisibility="All" FontSize="26" FontFamily="Arial" SelectionMode="Single">
</my:DataGrid>
2.9在上面把UI layout之後我們就要加入程式碼取得wcf資料,將資料連結到ui上面把畫面移到MainPage.xaml.cs
在MainPage Class 下加入
ObservableCollection<Employees> list;
在MainPage Initialize 函式中加入
NorthwindEntities northwind = new NorthwindEntities(new
Uri("http://localhost:1504/WcfDataService1.svc"));
// Get the query
var Query = northwind.Employees;
// Execute the query
Query.BeginExecute(
delegate(IAsyncResult asyncResult)
{
Dispatcher.BeginInvoke(
() =>
{
DataServiceQuery<Employees> query = asyncResult.AsyncState as
DataServiceQuery<Employees>;
if (query != null)
{
// Get the customers from the result of the asynchronous query.
var result = query.EndExecute(asyncResult);
list = new ObservableCollection<Employees>();
// Populate the collection
foreach (Employees emp in result)
{
list.Add(emp);
}
dgPager.Source =list;
dgPhone.ItemsSource = list;
}
}
);
},
Query
);
2.10 最後來執行我們想要的結果在vs210上方功能目錄點一下偵錯\開始執行就會看到Windows Phone 7 模擬器執行我們所寫的應用程式結果如下所示
以上流程可以看出來其實不難只是第一次生手沒做過會覺得很複雜為什麼要透過這樣的方式來取得資料庫資料,因為Windows Phone 的架構都是要透過HTTP的方式來跟外界面存取資料,所以才要使用WCF方式來過一手吧,如果想要連結別種資料庫如Oracle Database也是可以的不局限在sql Database.
此範例的程式碼
http://cid-a9e0769a31b89710.office.live.com/self.aspx/SampleCode/WcfService.zip