silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Silverlight 2.0 資料庫應用程式開發(1)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

  Silverlight 2.0 資料庫應用程式開發 (1)     文 / 黃忠成   從 Silverlight 1.0 到 Silverlight 2.0      我想不用我贅言,相較於 Silverlight 1.0 的陽春, Silverlight 2.0 提供了更完整的資料庫支援,其最主要的部份在於提供了 WCF/http 的網路機制及客戶端的控件 Binding 技術,有了這兩個

 

Silverlight 2.0 資料庫應用程式開發 (1)
 
 
/ 黃忠成
 
Silverlight 1.0 Silverlight 2.0
 
   我想不用我贅言,相較於 Silverlight 1.0 的陽春, Silverlight 2.0 提供了更完整的資料庫支援,其最主要的部份在於提供了 WCF/http 的網路機制及客戶端的控件 Binding 技術,有了這兩個機制,我們可以透過 WCF/http 網路機制連回 Server 端取得資料,然後以 Binding 技術將控件與資料結合在一起,設計出類似 Windows Form/WPF UI 介面的強大網頁資料庫應用程式。
 
Silverlight 2.0 N-Tier
 
   對於部份的 ASP.NET 設計師而言,對 Silverlight 2.0 的資料庫應用程式的開發模式會有些陌生,在 ASP.NET 設計模式中,我們可以直接使用 ADO.NET 來取得資料,接著利用 GridView 等資料控件將資料顯現於網頁上,此時的系統架構如圖 SL001
SL001

Silverlight 2.0 資料庫應用程式開發(1)

但在 Silverlight 2.0 中,並未提供 ADO.NET 這個機制,從網頁應用程式角度上看, Silverlight 2.0 是一種 Client Application 架構,運行於 IE 等瀏覽器平台之上,因此若要提供 ADO.NET 機制,那麼後端的資料庫必定得曝露於網際網路之上,而你肯定無法接受將 sql Server 曝露在網路上供人存取,因為這會帶來安全性、授權費等問題。所以,當使用 Silverlight 2.0 時,我們必須找一個相對於 ADO.NET 的機制來做為取得資料的中介層,這種設計模式就稱為 N-Tier ,見圖 SL002
SL002

Silverlight 2.0 資料庫應用程式開發(1)

如圖 SL002 所示, Silverlight 應用程式是內嵌於 HTML 中下載,她可以透過 WCF/httpWebrequest 網路機制連回來源的 Web Site 取得資料,問題在於後端的 Web Site 如何接收來自 Silverlight 的網路要求?在 Silverlight 2.0 中,你有兩種選擇,一是在 Web Site 端建立一個簡單的網頁,收取來自 Silverlight 的網路要求,接著輸出 XML 或是 JSON 格式的資料。二是透過 .NET WCF 機制,於 Web Site 端建立一個 WCF service ,於 Silverlight 中透過此 WCF service 來取得資料。兩種機制各有其優缺點,方法一可以適用於所有網頁平台,例如 ASP PHP JSP 皆可,而方法二則是僅限於支援 Web service 的網頁平台。
 
  在開始設計實際應用程式之時,你必須先了解所謂 N-Tier 架構的定義,所謂的 N-Tier 指的是將整個程式架構切分為三個層面,第一層是展現層,也就是你的 Silverlight 應用程式,用來顯示資料及接受使用者操作,第二層指的服務層,用來提供資料及回應來自展示層的要求,第三層則是資料層,用來由資料庫取得資料或是更新資料。 N-Tier 早期的發展是為了分擔資料庫系統的繁重工作,以 [ 偶而連線 ] [ 負載平衡 ] 等技巧,減輕本來必須全部交與資料庫處理的工作。舉個例來說,一系統擁有 10000 個使用者,當使用傳統的 Client/Server 架構時,這 10000 個使用者會握有 10000 個資料連線,當這些使用者發出要求資料的 SELECT 需求時,資料庫系統就得負擔產生 10000 個資料集的工作,但這 10000 個需求中,很有可能有一半以上是要求同一份資料。當使用 N-Tier 架構時,我們就可以在服務層中快取已取過的資料,當有同樣要求來臨時,直接以回傳快取資料的方式取代由資料庫系統取得的動作,這樣自然就減輕了資料庫的負擔,提高系統所能承載的用戶數量。
 
  在早期網際網路頻寬不足的環境下, N-Tier 架構原始設計中每個動作都要透過連結服務層的模式顯得有些不切實際,因為使用者可能處於一個低頻寬的環境、甚至是無網路可用的窘境,在這種模式下,存取服務層是種奢侈。因此, N-Tier 發展出一種名為 [ 偶爾連線 ] 的模式,展示層在有網路的情況下,將資料由服務層取回後快取於客戶端,此時使用者可以自由的操作展示層來新增、修改、刪除及查詢資料,這些動作全以客戶端的快取為主,待有網路時,再將異動資料整批傳回服務層更新回資料庫。
 
 [ 偶爾連線 ] 的架構很完美,也很符合當年的需求,但隨著網路的普遍化及高覆蓋率,設計 [ 偶而連線 ] 架構所需付出的代價就顯得有些累贅了, [ 偶爾連線 ] 的架構建立在完善的客戶端快取機制及客戶端查詢機制下,而這些機制並不容易建構。所以,現在的 N-Tier 轉變為以 [ 連線模式 ] 為主。
 
 Silverlight 2.0 的架構趨近於 [ 連線模式 ] ,這意味著 Silverlight 2.0 的應用程式將運行在一個可存取網站的環境下,當這個網站存在於本機時,程式不需要網路便可執行,當網站不存在於本機時,則需要網路方能運行。

註:多數瀏覽器都有一種以離線模式執行網頁的設定,將離線模式打開,你依舊能在離線模式下運行 Silverlight 程式,在適當的設計下,其實也能做出 [ 偶爾連線 ] 模式。

 
 
使用 httpWebrequest
 
  在大略了解 Silverlight 2.0 N-Tier 架構後,我們便可以開始撰寫 Silverlight 2.0 的資料庫應用程式,請建立一個 Silverlight 2.0 專案,接著於 Web 結尾之 Project 添加一資料庫。
SL003

Silverlight 2.0 資料庫應用程式開發(1)

SL004

Silverlight 2.0 資料庫應用程式開發(1)

然後添加一資料表至資料庫中。
SL005

Silverlight 2.0 資料庫應用程式開發(1)

建立結構。
SL006

Silverlight 2.0 資料庫應用程式開發(1)

添加資料列。
SL007

Silverlight 2.0 資料庫應用程式開發(1)

SL008

Silverlight 2.0 資料庫應用程式開發(1)

完成資料庫準備工作後,現在便可開始實作服務層,在這小節中,我們以傳統網頁模式來建立服務層,請於 Web 結尾之專案中添加 Generic Handler( 你也可以使用 .aspX)
SL009

Silverlight 2.0 資料庫應用程式開發(1)

DBProvider.ashx.cs
using @H_403_1216@ System;
using @H_403_1216@ System.Collections.Generic;
using @H_403_1216@ System.Linq;
using @H_403_1216@ System.Web;
using @H_403_1216@ System.Data;
using @H_403_1216@ System.Data.sqlClient;
using @H_403_1216@ System.Configuration;
using @H_403_1216@ System.Xml.Linq;
@H_403_1216@ 
namespace @H_403_1216@ DBDemo1.Web
@H_403_1216@{
@H_403_1216@    ///<sum@R_944_11035@>
@H_403_1216@    /// Sum@R_944_11035@ description for $codebehindclassname$
@H_403_1216@    ///</sum@R_944_11035@>
@H_403_1216@    public class DBProvider : IhttpHandler
@H_403_1216@    {
@H_403_1216@ 
@H_403_1216@        public void Processrequest(httpContext context)
@H_403_1216@        {
@H_403_1216@            context.Response.ContentType = "text/xml";
@H_403_1216@            using (sqlConnection conn = new sqlConnection(@"Data source=./sqlEXPRESS;AttachDbFilename=|DataDirectory|/MyDatabase.mdf;Integrated Security=True;User Instance=True"))
@H_403_1216@            {
@H_403_1216@                XDocument doc = new XDocument(new XElement("Root"));
@H_403_1216@                using (sqlCommand cmd = new sqlCommand("SELECT * FROM CUSTOMERS",conn))
@H_403_1216@                    conn.open();
@H_403_1216@                    using (sqlDataReader reader = cmd.ExecuteReader(
@H_403_1216@                                         CommandBehavior.CloseConnection))
@H_403_1216@                    {
@H_403_1216@                        while (reader.Read())
@H_403_1216@                            XElement elem = new XElement("Customer");
@H_403_1216@                            elem.Add(new XAttribute("CUSTOMER_ID",
@H_403_1216@                               reader.GetString(reader.GetOrdinal("CUSTOMER_ID"))));
@H_403_1216@                            elem.Add(new XAttribute("CUSTOMER_NAME",
@H_403_1216@                               reader.GetString(reader.GetOrdinal("CUSTOMER_NAME"))));
@H_403_1216@                            doc.Root.Add(elem);
@H_403_1216@                    }
@H_403_1216@                    context.Response.Write(doc.ToString());
@H_403_1216@                    context.Response.Flush();
@H_403_1216@                    context.Response.End();
@H_403_1216@            }
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        public bool IsReusable
@H_403_1216@        {
@H_403_1216@            get
@H_403_1216@            {
@H_403_1216@                return false;
@H_403_1216@            }
@H_403_1216@        }
@H_403_1216@    }
@H_403_1216@}

透過 IE 來測試此服務層是否運作正常。
SL010

Silverlight 2.0 資料庫應用程式開發(1)

由於本例將使用 DataGrid 控件,因此你必須透過 Add Reference( 加入參 ) 添加 DataGrid 所需要的 Assembly Silverlight 專案 ( 沒有 Web 結尾的那一個 )
SL011

Silverlight 2.0 資料庫應用程式開發(1)

SL012

Silverlight 2.0 資料庫應用程式開發(1)

另外,由於服務層使用 XML ,我們可以利用 Silverlight 2.0 所提供的 LINQ To XML 來簡化解譯 XML 的工作, LINQ To XML 需要添加 System.XMl.Linq.dll 為參,請透過 Add Reference 添加 System.XMl.Linq.dll Silverlight 專案中 ( 沒有 Web 結尾的那一個 )
SL013

Silverlight 2.0 資料庫應用程式開發(1)

接著在 Page.xaml 中鍵入以下的 XAML

Page.xaml
< UserControl x : Class ="DBDemo1.Page"
@H_403_1216@    xmlns="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml/presentation"
@H_403_1216@    xmlns:x="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml"     xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
@H_403_1216@    Width="400" Height="300" Loaded="UserControl_Loaded">
    < Grid x : Name ="LayoutRoot" BACkground ="White" Height ="300" Width ="400">
        < data : DataGrid x : Name ="grid" AutoGeneratecolumns ="True">
        </ data : DataGrid >
    </ Grid >
</ UserControl >

最後在 Page.xaml.cs 中鍵入以下的程式碼。

Page.xaml.cs
using @H_403_1216@ System;
using @H_403_1216@ System.Collections.Generic;
using @H_403_1216@ System.Linq;
using @H_403_1216@ System.Net;
using @H_403_1216@ System.Windows;
using @H_403_1216@ System.Windows.Controls;
using @H_403_1216@ System.Windows.Documents;
using @H_403_1216@ System.Windows.Input;
using @H_403_1216@ System.Windows.Media;
using @H_403_1216@ System.Windows.Media.Animation;
using @H_403_1216@ System.Windows.Shapes;
using @H_403_1216@ System.IO;
using @H_403_1216@ System.Xml;
using @H_403_1216@ System.Xml.Linq;
@H_403_1216@ 
namespace @H_403_1216@ DBDemo1
@H_403_1216@{
@H_403_1216@    public partial class Page : UserControl
@H_403_1216@    {
@H_403_1216@        public Page()
@H_403_1216@        {
@H_403_1216@            InitializeComponent();
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void UserControl_Loaded(object sender,RoutedEventArgs E)
@H_403_1216@        {
@H_403_1216@            httpWebrequest request = (httpWebrequest)Webrequest.Create(
@H_403_1216@                new Uri("http://localhost:40419/DBProvider.ashx",UriKind.AbsolutE));
@H_403_1216@            request.Method = "POST";
@H_403_1216@            request.beginGetrequestStream(new AsyncCallBACk(ReadCallBACk),request);
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void ReadCallBACk(IAsyncResult statE)
@H_403_1216@        {
@H_403_1216@            httpWebrequest request = (httpWebrequest)state.AsyncState;           
@H_403_1216@            Stream postStream = request.EndGetrequestStream(statE);
@H_403_1216@            //byte[] buff = System.Text.Encoding.Unicode.GetBytes("TEST");
@H_403_1216@            //postStream.Write(buff,buff.Length);
@H_403_1216@            postStream.Close(); // the request stream must closed before
@H_403_1216@            request.beginGetResponse(new AsyncCallBACk(GetResponsE),request);
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void GetResponse(IAsyncResult statE)
@H_403_1216@        {
@H_403_1216@            httpWebrequest request = (httpWebrequest)state.AsyncState;
@H_403_1216@            httpWebResponse response = (httpWebResponse)request.EndGetResponse(statE);
@H_403_1216@            using (Stream stream = response.GetResponseStream())
@H_403_1216@            {
@H_403_1216@                XDocument doc = XDocument.Load(stream);
@H_403_1216@                Dispatcher.beginInvoke(
@H_403_1216@                  new System.Threading.ParameterizedThreadStart(updateUI), doc);
@H_403_1216@            }
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@       private void updateUI(object statE)
@H_403_1216@        {
@H_403_1216@            XDocument doc = (XDocument)state;
@H_403_1216@            grid.Itemssource = (from s1 in doc.Elements("Root").Descendants("Customer")
@H_403_1216@                                       id = s1.Attribute("CUSTOMER_ID").Value,
@H_403_1216@        }
@H_403_1216@    }
@H_403_1216@ 
@H_403_1216@    public class Customer
@H_403_1216@    {
@H_403_1216@        public String ID { get; set; }
@H_403_1216@        public String Name { get; set; }
@H_403_1216@    }
@H_403_1216@}

SL014 是此例執行結果。
SL014

Silverlight 2.0 資料庫應用程式開發(1)

透過 httpWebrequest 的模式,我們可以用傳統網頁來扮演服務層,這可應用於多數網頁平台如 PHP ASP JSP 之上。
 
使用 WCF
 
   使用 httpWebrequest 的方式雖然簡單,但缺點是我們得自訂其間資料傳送的格式,最大化相容性的結果也限縮了結構性,所幸在現今網路世界中早已定義了多數網頁平台都支援的資料格式,那就是 SOAP/Web service Silverlight 2.0 除了允許我們撰寫 Web service 的客戶端外,同時也支援了 .NET Framework 3.0 中所新增的 WCF service ,本例就以 WCF service 做為服務層,請添加一個 Web service Web 結尾的專案中。
SL015

Silverlight 2.0 資料庫應用程式開發(1)

然後添加一個 LINQ To sql Classes Web 結尾的專案中,做為取代 ADO.NET 的資料存取機制。
SL016

Silverlight 2.0 資料庫應用程式開發(1)

添加資料表至 .DBML 中。
SL017

Silverlight 2.0 資料庫應用程式開發(1)

刪除自動產生的 IDBservice.cs ,然後於 DBservice.svc.cs 中鍵入以下程式碼。

DBservice.svc.cs
using @H_403_1216@ System;
using @H_403_1216@ System.Collections.Generic;
using @H_403_1216@ System.Linq;
using @H_403_1216@ System.Runtime.serialization;
using @H_403_1216@ System.serviceModel;
using @H_403_1216@ System.Text;
@H_403_1216@ 
namespace @H_403_1216@ DBDemo1.Web
@H_403_1216@{
@H_403_1216@    [serviceContract]
@H_403_1216@    public interface IDBservice
@H_403_1216@    {
@H_403_1216@        [OperationContract]
@H_403_1216@        CUSTOMERS[] GetData();
@H_403_1216@    }
@H_403_1216@   
@H_403_1216@    public class DBservice : IDBservice
@H_403_1216@    {       
@H_403_1216@        public CUSTOMERS[] GetData()
@H_403_1216@        {
@H_403_1216@            using (@H_824_1363@myDBDataContext context = new @H_824_1363@myDBDataContext())
@H_403_1216@            {
@H_403_1216@                return (from s1 in context.CUSTOMERS SELEct s1).ToArray();
@H_403_1216@            }
@H_403_1216@        }
@H_403_1216@    }
@H_403_1216@}

修改 web.config serviceModel 區段的設定。

web.config
............
< services >
   < service behaviorConfiguration = @H_403_1216@"DBDemo1.Web.DBserviceBehavior"
               name = @H_403_1216@"DBDemo1.Web.DBservice">
    < endpoint address = @H_403_1216@""binding="basichttpBinding"contract="DBDemo1.Web.IDBservice">
     < identity >
      < dns value = @H_403_1216@"localhost" />
     </ identity >
    </ endpoint >
    < endpoint address = @H_403_1216@"@H_202_1355@mex"binding="@H_202_1355@mexhttpBinding"contract="IMetadataExchange" />
   </ service >
 </ services >
............

Silverlight 專案中,添加 service Reference( 服務參 )
SL018

Silverlight 2.0 資料庫應用程式開發(1)

SL019

Silverlight 2.0 資料庫應用程式開發(1)

添加 Silverlight UserControl
SL020

Silverlight 2.0 資料庫應用程式開發(1)

程式碼如下所示。

Page2.xaml
< UserControl x : Class ="DBDemo1.Page2"
@H_403_1216@    xmlns="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml/presentation"
@H_403_1216@    xmlns:x="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml"     xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
@H_403_1216@    Width="400" Height="300" Loaded="UserControl_Loaded">
    < Grid x : Name ="LayoutRoot" BACkground ="White" Height ="300" Width ="400">
        < data : DataGrid x : Name ="grid" AutoGeneratecolumns ="True">
        </ data : DataGrid >
    </ Grid >
</ UserControl >
Page2.xaml.cs
using @H_403_1216@ System;
using @H_403_1216@ System.Collections.Generic;
using @H_403_1216@ System.Linq;
using @H_403_1216@ System.Net;
using @H_403_1216@ System.Windows;
using @H_403_1216@ System.Windows.Controls;
using @H_403_1216@ System.Windows.Documents;
using @H_403_1216@ System.Windows.Input;
using @H_403_1216@ System.Windows.Media;
using @H_403_1216@ System.Windows.Media.Animation;
using @H_403_1216@ System.Windows.Shapes;
@H_403_1216@ 
namespace @H_403_1216@ DBDemo1
@H_403_1216@{
@H_403_1216@    public partial class Page2 : UserControl
@H_403_1216@    {
@H_403_1216@        public Page2()
@H_403_1216@        {
@H_403_1216@            InitializeComponent();
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void UserControl_Loaded(object sender,RoutedEventArgs E)
@H_403_1216@            serviceReference1.DBserviceClient client =
@H_403_1216@                 new DBDemo1.serviceReference1.DBserviceClient();
@H_403_1216@            client.GetDataCompleted +=
             new @H_403_1216@ EventHandler<DBDemo1.serviceReference1.GetDataCompletedEventArgs>(
@H_403_1216@               client_GetDataCompleted);
@H_403_1216@            client.GetDataAsync();
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        void client_GetDataCompleted(object sender,
@H_403_1216@                     DBDemo1.serviceReference1.GetDataCompletedEventArgs E)
@H_403_1216@        {
@H_403_1216@            grid.Itemssource = e.Result;
@H_403_1216@        }
@H_403_1216@    }
@H_403_1216@}

此例執行結果同前例。
 
使用 ADO.NET Data service Framework
 
   WCF/Web service 做為服務層雖然很完美,但設計師仍然得自行定義取得資料、查詢資料、更新資料的函式,在 .NET Framework 3.5 中,這些工作可以交給 ADO.NET Data service Framework 來負責,這樣可以減輕設計師自行架構服務層規格的負擔,也能統一個別服務層的規格,避免不同設計師設計出不同的規格。預設情況下, ADO.NET Data service Framework 的資料層必須是 ADO.NET Entity Framework ,所以請於 Web 結尾的專案中添加 ADO.NET Entity Data Model 項目。
SL021

Silverlight 2.0 資料庫應用程式開發(1)

SL022

Silverlight 2.0 資料庫應用程式開發(1)

SL023

Silverlight 2.0 資料庫應用程式開發(1)

 
SL024

Silverlight 2.0 資料庫應用程式開發(1)

完成後,在 Web 結尾的專案中添加一個 ADO.NET Data service 項目。
SL025

Silverlight 2.0 資料庫應用程式開發(1)

WebDataservice1.svc.cs 中鍵入以下程式碼。

WebDataservice1.svc.cs
using @H_403_1216@ System;
using @H_403_1216@ System.Collections.Generic;
using @H_403_1216@ System.Data.services;
using @H_403_1216@ System.Linq;
using @H_403_1216@ System.serviceModel.Web;
using @H_403_1216@ System.Web;
@H_403_1216@ 
namespace @H_403_1216@ DBDemo1.Web
@H_403_1216@{
@H_403_1216@    public class WebDataservice1 : Dataservice< EntityData.@H_824_1363@myDatabaseEntities>
@H_403_1216@    {
@H_403_1216@        // This method is called only once to initialize service-wide policies.
@H_403_1216@        public static void Initializeservice(IDataserviceConfiguration config)
@H_403_1216@        {
@H_403_1216@            config.SetEntitySetAccessRule("*",EntitySetrights.All);
@H_403_1216@            config.SetserviceOperationAccessRule("*",serviceOperationRights.All);
@H_403_1216@        }
@H_403_1216@    }
@H_403_1216@}

完成後編譯專案,接著於 Silverlight 2.0 添加 service Reference
SL026

@H_580_4932@

然後於 Silverlight 專案中添加一新的 Silverlight User Control

Page3.xaml
< UserControl x : Class ="DBDemo1.Page3"
@H_403_1216@    xmlns="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml/presentation"
@H_403_1216@    xmlns:x="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml"     xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
@H_403_1216@    Width="400" Height="300" Loaded="UserControl_Loaded">
    < Grid x : Name ="LayoutRoot" BACkground ="White" Height ="300" Width ="400">
        < data : DataGrid x : Name ="grid" AutoGeneratecolumns ="True">
        </ data : DataGrid >
    </ Grid >
</ UserControl >
Page3.xaml.cs
using @H_403_1216@ System;
using @H_403_1216@ System.Collections.Generic;
using @H_403_1216@ System.Linq;
using @H_403_1216@ System.Net;
using @H_403_1216@ System.Windows;
using @H_403_1216@ System.Windows.Controls;
using @H_403_1216@ System.Windows.Documents;
using @H_403_1216@ System.Windows.Input;
using @H_403_1216@ System.Windows.Media;
using @H_403_1216@ System.Windows.Media.Animation;
using @H_403_1216@ System.Windows.Shapes;
using @H_403_1216@ System.Data.services.CLIENt;
@H_403_1216@ 
namespace @H_403_1216@ DBDemo1
@H_403_1216@{
@H_403_1216@    public partial class Page3 : UserControl
@H_403_1216@    {
@H_403_1216@        public Page3()
@H_403_1216@        {
@H_403_1216@            InitializeComponent();
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void UserControl_Loaded(object sender,RoutedEventArgs E)
@H_403_1216@        {
@H_403_1216@            serviceReference2.@H_824_1363@myDatabaseEntities3 entities =
            new @H_403_1216@ DBDemo1.serviceReference2.@H_824_1363@myDatabaseEntities3(
               new @H_403_1216@ Uri("WebDataservice1.svc",UriKind.RelativE));
@H_403_1216@            var result = from s1 in entities.CUSTOMERS SELEct s1;
@H_403_1216@            ((DataserviceQuery<serviceReference2.CUSTOMERS>)result).beginExecute(
@H_403_1216@                      new AsyncCallBACk(ReadCallBACk),result);
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void ReadCallBACk(IAsyncResult statE)
@H_403_1216@        {
@H_403_1216@            DataserviceQuery<serviceReference2.CUSTOMERS> svcCtx =
@H_403_1216@                (DataserviceQuery<serviceReference2.CUSTOMERS>)state.AsyncState;
@H_403_1216@            //remember,you must call tolist,toarray before set to itemsource.
@H_403_1216@            grid.Itemssource = svcCtx.EndExecute(statE).ToList();
@H_403_1216@        }
@H_403_1216@    }
@H_403_1216@}

此例執行結果如前例。使用 ADO.NET Data service 的好處在於能統一存取資料時的服務端規格,尤其在 Silverlight 2.0 所提供的 ADO.NET Data service Client Framework 的幫助下,設計師還能輕鬆的更新資料庫,其間資料傳遞及異動機制都不需要設計師操心。
 
實作 [ 偶而連線 ] 模式
 
   或許你曾經聽過, Sivlerlight 不支援離線操作這檔事,事實的確是如此,但這指的是 Silverlight 不能像 Flash 般,包成一單一的執行檔來執行,透過 IE 等瀏覽器提供的離線模式,在沒有網路的情況下運行 Silverlight 程式依舊是可行的,前提是你的程式必須運用 Silverlight 2.0 中的 Isolate Storage 機制來儲存快取資料,而使用者至少需連線一次,讓相關的 Silverlight 程式下載到客戶端,下面的程式是一個可離線操作的簡單例子。

Page4.xaml
< UserControl x : Class ="DBDemo1.Page4"
@H_403_1216@    xmlns="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml/presentation"
@H_403_1216@    xmlns:x="http://scheR_585_11845@as.microsoft.com/winfx/2006/xaml"
@H_403_1216@    xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
@H_403_1216@    Width="400" Height="300" Loaded="UserControl_Loaded">
    < Grid x : Name ="LayoutRoot" BACkground ="White" Height ="300" Width ="400">
        < data : DataGrid x : Name ="grid" AutoGeneratecolumns ="True">
        </ data : DataGrid >
    </ Grid >
</ UserControl >
Page4.xaml.cs
using @H_403_1216@ System;
using @H_403_1216@ System.Collections.Generic;
using @H_403_1216@ System.Linq;
using @H_403_1216@ System.Net;
using @H_403_1216@ System.Windows;
using @H_403_1216@ System.Windows.Controls;
using @H_403_1216@ System.Windows.Documents;
using @H_403_1216@ System.Windows.Input;
using @H_403_1216@ System.Windows.Media;
using @H_403_1216@ System.Windows.Media.Animation;
using @H_403_1216@ System.Windows.Shapes;
using @H_403_1216@ System.IO;
using @H_403_1216@ System.IO.IsolatedStorage;
using @H_403_1216@ System.Xml.Linq;
@H_403_1216@ 
@H_403_1216@ 
namespace @H_403_1216@ DBDemo1
@H_403_1216@{
@H_403_1216@    public partial class Page4 : UserControl
@H_403_1216@    {
@H_403_1216@        public Page4()
@H_403_1216@        {
@H_403_1216@            InitializeComponent();
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void UserControl_Loaded(object sender,RoutedEventArgs E)
@H_403_1216@        {
@H_403_1216@            httpWebrequest request = (httpWebrequest)Webrequest.Create(
@H_403_1216@                 new Uri("http://localhost:40419/DBProvider.ashx",request);
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void ReadCallBACk(IAsyncResult statE)
@H_403_1216@        {
@H_403_1216@            httpWebrequest request = (httpWebrequest)state.AsyncState;
@H_403_1216@            Stream postStream = request.EndGetrequestStream(statE);
@H_403_1216@            //byte[] buff = System.Text.Encoding.Unicode.GetBytes("TEST");
@H_403_1216@            //postStream.Write(buff,request);
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void GetResponse(IAsyncResult statE)
@H_403_1216@        {
@H_403_1216@            try
@H_403_1216@            {
@H_403_1216@                httpWebrequest request = (httpWebrequest)state.AsyncState;
@H_403_1216@                httpWebResponse response = (httpWebResponse)request.EndGetResponse(statE);
@H_403_1216@                using (Stream stream = response.GetResponseStream())
@H_403_1216@                    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
@H_403_1216@                    {
@H_403_1216@                        store.CreateDirectory("Data");
@H_403_1216@                        IsolatedStorageFileStream subDirFile =
@H_403_1216@                          store.CreateFile(System.IO.Path.Combine("Data","dbdata.txt"));
@H_403_1216@                        using (StreamWriter sw = new StreamWriter(subDirFilE))
@H_403_1216@                            using(StreamReader sr = new StreamReader(stream))
@H_403_1216@                                sw.Write(sr.ReadToEnd());
@H_403_1216@ 
@H_403_1216@                    }
@H_403_1216@                    XDocument doc = XDocument.Load(stream);
@H_403_1216@                    Dispatcher.beginInvoke(
@H_403_1216@                       new System.Threading.ParameterizedThreadStart(updateUI),doc);
@H_403_1216@            }
@H_403_1216@            catch (Exception eX)
@H_403_1216@            {
@H_403_1216@                using (var store = IsolatedStorageFile.GetUserStoreForApplication())
@H_403_1216@                {
@H_403_1216@                    IsolatedStorageFileStream subDirFile =
@H_403_1216@                store.openFile(System.IO.Path.Combine("Data","dbdata.txt"),FileMode.open);
@H_403_1216@                    XDocument doc = XDocument.Load(subDirFilE);
@H_403_1216@                    subDirFile.Close();
@H_403_1216@                    Dispatcher.beginInvoke(
@H_403_1216@                  new System.Threading.ParameterizedThreadStart(updateUI),doc);
@H_403_1216@            }
@H_403_1216@        }
@H_403_1216@ 
@H_403_1216@        private void updateUI(object statE)
@H_403_1216@        {
@H_403_1216@            XDocument doc = (XDocument)state;
@H_403_1216@            grid.Itemssource = (from s1 in doc.Elements("Root").Descendants("Customer")
@H_403_1216@                                    ID = s1.Attribute("CUSTOMER_ID").Value,
@H_403_1216@        }
@H_403_1216@    }
@H_403_1216@}

適當使用 Isolate Storage 來儲存資料快取,可以讓應用程式減少網路流量,達到提升效率的目的。
SL027

Silverlight 2.0 資料庫應用程式開發(1)

 
Next Time...
 
  下次有機會的話,我們再來討論較進階的資料庫應用程式撰寫技巧,例如異動資料、查詢及處理關聯等等。
 

大佬总结

以上是大佬教程为你收集整理的Silverlight 2.0 資料庫應用程式開發(1)全部内容,希望文章能够帮你解决Silverlight 2.0 資料庫應用程式開發(1)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。