#眉標=Silverlight、ADO.NET、Linq #副標=Silverlight開發技術(13) #大標=在Silverlight 2.0中使用ADO.NET Data Service #作者=文/圖 董大偉 ============= 程式1 Public Class WebDataService1 '在Of的後面填入Data Model名稱:cNorthWindEntities Inherits DataService(Of cNorthWindEntities) ' 服務初始化設定 Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration) ' 設定存取權限(『*』代表所有資料表) config.SetEntitySetAccessRule("*", EntitySetRights.All) config.UseVerboseErrors = True End Sub End Class ================ ============= 程式2 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) '設定調用URL→WebDataService2.svc Dim ServiceContext As New System.Data.Services.Client.DataServiceContext(New Uri("WebDataService2.svc", UriKind.Relative)) '送出抓取資料的命令 '→WebDataService2.svc/Customers?$filter=Country eq 'Germany' '預期回傳值為Customers ServiceContext.BeginExecute(Of ServiceReference2.Customers)(New Uri("Customers?$filter=Country eq 'Germany'", UriKind.Relative), AddressOf loadDataCallback, ServiceContext) End Sub ================ ============= 程式3 'call back handler Private Sub loadDataCallback(ByVal asyncResult As IAsyncResult) Dim ctx As System.Data.Services.Client.DataServiceContext = asyncResult.AsyncState '抓回取得的資料(型別為Customers, 因預期回傳值為Customers) Dim result = ctx.EndExecute(Of ServiceReference2.Customers)(asyncResult) '將取得的資料填入ListBox1 For Each item As ServiceReference2.Customers In result ListBox1.Items.Add(item.CompanyName) Next '顯示訊息 Windows.Browser.HtmlPage.Window.Alert("OK") End Sub ================ ============= 程式4 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) '建立服務 Dim srv1 As New ServiceReference1.cNorthWindEntities(New Uri("WebDataService1.svc", UriKind.Relative)) '建立Query Dim userQuery As System.Data.Services.Client.DataServiceQuery(Of ServiceReference1.客戶) userQuery = From c In srv1.客戶 Where c.城市 = "台中市" '執行Query, 以QueryCallback接收回傳值 End Sub ================ ============= 程式5 '接收回傳值 Sub QueryCallback(ByVal result As System.IAsyncResult) Dim query As System.Data.Services.Client.DataServiceQuery(Of ServiceReference1.客戶) = result.AsyncState '將抓取到的資料填入ListBox Dim ReturnData = query.EndExecute(result) For Each item As ServiceReference1.客戶 In ReturnData Me.ListBox1.Items.Add(item.公司名稱) Next '顯示訊息 Windows.Browser.HtmlPage.Window.Alert("OK") End Sub ================ ============= 程式6 Dim ServiceContext As ServiceReference1.cNorthWindEntities Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) '設定調用URL→遠端ADO.NET Data Service -->WebDataService1.svc ServiceContext = New ServiceReference1.cNorthWindEntities(New Uri("WebDataService1.svc", UriKind.Relative)) '建立『客戶』物件實體 Dim NewCustomer As New ServiceReference1.客戶 '指定值 NewCustomer.客戶編號 = Me.Txb_CustID.Text NewCustomer.公司名稱 = Me.Txb_CustName.Text NewCustomer.行政區 = "台北" '新增至資料表 ServiceContext.AddTo客戶(NewCustomer) '調用非同步儲存動作(事件處理函式:OnSaveChangesCompleted) ServiceContext.BeginSaveChanges(AddressOf OnSaveChangesCompleted, NewCustomer) End Sub Private Sub OnSaveChangesCompleted(ByVal result As IAsyncResult) Try '結束非同步新增動作 ServiceContext.EndSaveChanges(result) '顯示訊息 Windows.Browser.HtmlPage.Window.Alert(" 成功: " & TryCast(result.AsyncState, ServiceReference1.客戶).客戶編號) Catch ex As System.Data.Services.Client.DataServiceRequestException Windows.Browser.HtmlPage.Window.Alert(" Error: " & ex.Response.BatchStatusCode) End Try End Sub ================ ============= 程式7 'ADO.NET Data Service proxy Dim svcContext As ServiceReference1.cNorthWindEntities '存放資料用 Dim DataCollection As ObservableCollection(Of ServiceReference1.客戶) '取得資料(填入DataGrid) Sub GetData() '設定調用URL --> WebDataService1.svc svcContext = New ServiceReference1.cNorthWindEntities(New Uri("WebDataService1.svc", UriKind.Relative)) '存放資料用 DataCollection = New ObservableCollection(Of ServiceReference1.客戶)() '抓取資料(客戶資料表) Dim query As System.Data.Services.Client.DataServiceQuery(Of ServiceReference1.客戶) = svcContext.客戶 Try '非同步抓取資料 query.BeginExecute(AddressOf GetDataCallback, query) Catch ex As System.Data.Services.Client.DataServiceRequestException Windows.Browser.HtmlPage.Window.Alert("OnGetData Error: " & ex.Response.ToString()) End Try End Sub '取回非同步抓取資料的值(填入DataGrid) Private Sub GetDataCallback(ByVal result As IAsyncResult) Try Dim queryResult As System.Data.Services.Client.DataServiceQuery(Of ServiceReference1.客戶) = result.AsyncState Dim results = queryResult.EndExecute(result) For Each item As ServiceReference1.客戶 In results '將取得的資料填入DataCollection DataCollection.Add(item) Next '將DataCollection填入DataGrid DataGrid1.DataContext = DataCollection Catch ex As System.Data.Services.Client.DataServiceRequestException Windows.Browser.HtmlPage.Window.Alert("GetDataCallback Error: " & ex.Response.ToString()) End Try End Sub ================    ============= 程式8 Private Sub Button_delete_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Dim DataRecord As ServiceReference1.客戶 '被選取的記錄 DataRecord = DataGrid1.SelectedItem '刪除資料 DeleteRecord(DataRecord) '顯示訊息 Windows.Browser.HtmlPage.Window.Alert("OK") End Sub '刪除記錄 Sub DeleteRecord(ByVal dataRecord As ServiceReference1.客戶) Try svcContext.DeleteObject(dataRecord) svcContext.BeginSaveChanges(AddressOf OnSaveChangesCompleted, svcContext) Catch ex As System.Data.Services.Client.DataServiceRequestException Windows.Browser.HtmlPage.Window.Alert(" Error: " & ex.Response.ToString()) End Try End Sub ================       ============= 程式9 '更新記錄 Sub UpdateRecord(ByVal dataRecord As ServiceReference1.客戶) Try svcContext.UpdateObject(dataRecord) svcContext.BeginSaveChanges(AddressOf OnSaveChangesCompleted, svcContext) Catch ex As System.Data.Services.Client.DataServiceRequestException Windows.Browser.HtmlPage.Window.Alert(" Error: " & ex.Response.ToString()) End Try End Sub ================