轉帖|其它|編輯:郝浩|2010-12-17 14:15:53.000|閱讀 1826 次
概述:在“Silverlight與常用數據庫互操作系列”文章中介紹了使用Silverlight存取不同數據庫的方法和步驟。但是對于Silverlight存取MS SQL介紹的不夠全面,這里我想介紹Silverlight如何通過WCF訪問MSSQL數據庫存儲過程的。希望對大家能夠有所幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
我們要實現, 用戶輸入用戶名和密碼后,點擊登錄按鈕,傳遞用戶名和密碼到服務器端, 通過WCF訪問MSSQL數據庫,調用存儲過程,在服務器端對用戶名和密碼進行匹配,匹配成功,則返回登錄成功,否則,則是失敗。
在文章開始前,我們需要做一下準備工作,
添加內容到Users表,為了方便起見,密碼全部使用明文,在正式項目中,建議對密碼字段進行加密使用。
這里,我們驗證用戶名和密碼,有兩種簡單方式:
一是使用存儲過程讀取用戶名和密碼,然后在服務器端進行用戶名和密碼匹配校驗,如果查找到匹配數據,則返回登錄成功,否則,則是登錄失敗;
二是傳用戶名和密碼到存儲過程中,在數據庫存儲過程中進行判斷,使用Select語句進行查找,對應用戶名和密碼,如果查找到匹配結果,則返回用戶ID, 服務器端接收到用戶ID,則返回登錄成功,否則,則是失敗;
在本例中,主要是對Silverlight訪問數據庫進行講述,所以,對于驗證方法,不進行詳細描述和講解,如果有問題,可以留言給我,我們繼續討論,這里,我將使用第一種驗證方法。 為此,建立一個簡單的存儲過程:
1 CREATE PROCEDURE [dbo].[Login]
2 ( @UserName Varchar(30))
3 AS
4
5 Select cUserName, cPassword
6 From Users
7 Where cUserName = @UserName
8
9 RETURN
10
11 SET NOCOUNT ON
在完成上面的準備工作后,開始建立新的Silverlight項目.
1. 建立一個新項目"SilverlightDBDemo",
2. 在MainPage中建立簡單的登錄界面,如下:
3. 在Web項目中添加新選項
4. 添加一個簡單的用戶信息類Users,作為WCF的契約成員,當我們從數據庫中讀取信息后,將賦值給該類的契約成員,方便客戶端進行調用;
VS2008將自動生成Users類代碼,在類命名前添加數據契約屬性[DataContract()]。 為了能夠使綁定數據返回修改通知,這里需要繼承INotifyPropertyChanged接口,該步驟不添加對本教程也沒有影響,為了以后例程代碼完整性,這里我繼承了該接口。在接口上點擊右鍵,生成代碼。
代碼如下:
1 namespace SilverlightDBDemo.Web
2 {
3 [DataContract()]
4 public class Users : INotifyPropertyChanged
5 {
6
7 #region INotifyPropertyChanged Members
8
9 public event PropertyChangedEventHandler PropertyChanged;
10
11 #endregion
12 }
13 }
14
5. 在Users類中,添加契約成員
1 private string userName;
2 [DataMember()]
3 public string UserName
4 {
5 get { return userName; }
6 set { userName = value;}
7 }
8
9 private string password;
10 [DataMember()]
11 public string Password
12 {
13 get { return password; }
14 set { password = value; }
15 }
6. 建立構造函數 public Users(string sUserName,string sPassword),傳遞用戶名和密碼給契約成員;
1 using System;
2 using System.ComponentModel;
3 using System.Runtime.Serialization;
4
5 namespace SilverlightDBDemo.Web
6 {
7 [DataContract()]
8 public class Users : INotifyPropertyChanged
9 {
10 private string userName;
11 [DataMember()]
12 public string UserName
13 {
14 get { return userName; }
15 set { userName = value;}
16 }
17
18 private string password;
19 [DataMember()]
20 public string Password
21 {
22 get { return password; }
23 set { password = value; }
24 }
25
26 public Users(string sUserName,string sPassword)
27 {
28 UserName = sUserName;
29 Password = sPassword;
30 }
31
32 #region INotifyPropertyChanged Members
33
34 public event PropertyChangedEventHandler PropertyChanged;
35
36 #endregion
37 }
38 }
7. 添加"Silverlight-enabled WCF Service",修改服務名字為 DBService.svc,需要注意的是,WCF service對于Silverlight僅支持BasicHttpBinding,而VS2008自動生成是customBinding,很多朋友說使用了"Silverlight-enabled WCF Service",鏈接數據庫仍舊失敗,無法找到遠程服務器,是因為沒有使用BasicHttpBinding進行通訊,造成的失敗。
后文我將講述如何修改。
8. 添加后,在Web服務器端會有DBService.svc和DBService.svc.cs文件出現,VS2008將自動更新Web項目的類庫引用;
9. 雙擊進入DBService.svc.cs文件,可以看到以下代碼:
1 using System;
2 using System.Linq;
3 using System.Runtime.Serialization;
4 using System.ServiceModel;
5 using System.ServiceModel.Activation;
6 using System.Collections.Generic;
7 using System.Text;
8
9 namespace SilverlightDBDemo.Web
10 {
11 [ServiceContract(Namespace = "")]
12 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
13 public class DBService
14 {
15 [OperationContract]
16 public void DoWork()
17 {
18 // Add your operation implementation here
19 return;
20 }
21
22 // Add more operations here and mark them with [OperationContract]
23 }
24 }
這里我們沒有修改ServiceContract命名空間,所以保持默認為空,AspNet的兼容需求模式我們保持默認。在正式項目中,我們習慣將所有的[OperationContract]函數放入一個接口文件中,這樣方便擴展以及維護,在本例,為了方便大家理解,就不把[OperationContract]放入接口文件。 在VS2008自動生成代碼下面直接添加數據庫訪問代碼。
10. 在添加服務器端數據庫訪問代碼前,需要修改Web.Config文件。和Asp.Net項目一樣,在鏈接數據庫前,我們首先需要在Web.Config中配置數據庫連接字符串,請自行替換數據庫登錄ID和密碼
1 <appSettings>
2 <add key="DbServiceConnectionString" value="Data Source=(Local);Initial Catalog=SilverlightDemo;User Id=dev;Password=de 3 </appSettings>
11. 前文已經說過,Silverlight僅支持使用BasicHttpBinding通過WCF service進行通訊,而VS2008自動生成的代碼是customBinding,所以,我們也需要在Web.Config中進行修改.下面是VS2008自動生成的Web.Config部分代碼,劃線部分是下面要修改的部分。
1 <system.serviceModel>
2 <behaviors>
3 <serviceBehaviors>
4 <behavior name="SilverlightDBDemo.Web.DBServiceBehavior">
5 <serviceMetadata httpGetEnabled="true" />
6 <serviceDebug includeExceptionDetailInFaults="False" />
7 </behavior>
8 </serviceBehaviors>
9 </behaviors>
10 <bindings>
11 <customBinding>
12 <binding name="customBinding0">
13 <binaryMessageEncoding />
14 <httpTransport />
15 </binding>
16 </customBinding>
17 </bindings>
18 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
19 <services>
20 <service behaviorConfiguration="SilverlightDBDemo.Web.DBServiceBehavior"
21 name="SilverlightDBDemo.Web.DBService">
22 <endpoint address="" binding="customBinding"
bindingConfiguration="customBinding0"
23 contract="SilverlightDBDemo.Web.DBService" />
24 <endpoint address="mex" binding=
"mexHttpBinding" contract="IMetadataExchange" />
25 </service>
26 </services>
27 </system.serviceModel>
這里我們需要修改以下幾個地方:
首先刪除customBinding,從上面代碼,第10行,到17行,使用下面代碼替換:
1 <bindings>
2 <basicHttpBinding>
3 <binding name="BasicHttpBinding_IDataService"
4 maxBufferPoolSize="2147483647"
5 maxReceivedMessageSize="2147483647"
6 maxBufferSize="2147483647">
7 <readerQuotas
8 maxArrayLength="2147483647"
9 maxBytesPerRead="2147483647"
10 maxDepth="2147483647"
11 maxNameTableCharCount="2147483647"
12 maxStringContentLength="2147483647" />
13 </binding>
14 </basicHttpBinding>
15 </bindings>
其中那些2147483647之類的屬性可以刪除,但是如果讀取數據庫中的大型表格,就需要設置緩沖池之類的尺寸了。這里,我們已經使用了basicHttpBinding. Binding name我使用了BasicHttpBinding_DBService,大家可以隨意更換,下面將用到。
然后修改22行和23行的代碼,將endpoint中的binding,內容修改為basicHttpBinding,bindingConfiguration的內容修改為BasicHttpBinding_DBService。
1 <endpoint address="" binding="basicHttpBinding" bindingConfiguration=
"BasicHttpBinding_DBService"
2 contract="SilverlightDBDemo.Web.DBService" />
12. 現在我們可以在DBService.svc.cs中添加存取數據庫代碼,對用戶名和密碼進行簡單匹配,這里不再著重講述如何條件匹配登錄信息。這里演示了如何調用數據庫存儲過程。完成存取數據庫代碼后,成功編譯Web項目。代碼有點長,這里折疊起來。
代碼 :
1 private string connectionString = WebConfigurationManager.AppSettings["DbServiceConnectionString"];
2
3 [OperationContract]
4 public bool GetUser(string cUserName, string cPassword)
5 {
6 SqlConnection conn = new SqlConnection(connectionString);
7 SqlCommand cmd = new SqlCommand("Login", conn);
8 cmd.CommandType = CommandType.StoredProcedure;
9 cmd.Parameters.AddWithValue("@UserName", cUserName);
10
11 try
12 {
13 conn.Open();
14 SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
15 if (reader.Read())
16 {
17 Users user = new Users((string)reader["cUserName"],
18 (string)reader["cPassword"]);
19 if (user.Password == cPassword)
20 {
21 return true;
22 }
23 else
24 {
25 return false;
26 }
27 }
28 else
29 {
30 return false;
31 }
32 }
33 finally
34 {
35 conn.Close();
36 }
37 }
13. 在SilverlightDBDemo客戶端,點擊右鍵添加服務引用
14. 在彈出窗口中,點擊"Discover",查找本地WCF service。在地址欄會自動搜索到本地的Service引用,在Services樹形框中我們可以看到,在服務器端建立的DBService.svc,雙擊打開,可以看到,我們建立的GetUser函數,以及默認的DoWork函數。修改下面的命名空間為"DBService",方便調用。
15. 點擊"Advanced.."高級按鈕,確認選中"Reuse types in referenced assembiles",如下圖
16. 然后,點擊確定,會在客戶端中生成DBService服務引用。
17. 在生成DBService服務引用后,VS2008會自動生成一個ServiceReferences.ClientConfig文件。 我們需要留意查看一下該文件內容。其中,bindings信息是basicHttpBinding,而endpoint內容和Web.Config中的內容相同。這里我們不需要修改任何代碼。
1 <configuration>
2 <system.serviceModel>
3 <bindings>
4 <basicHttpBinding>
5 <binding name="BasicHttpBinding_DBService" maxBufferSize="2147483647"
6 maxReceivedMessageSize="2147483647">
7 <security mode="None">
8 <transport>
9 <extendedProtectionPolicy policyEnforcement="Never" />
10 </transport>
11 </security>
12 </binding>
13 </basicHttpBinding>
14 </bindings>
15 <client>
16<endpoint address=
"//localhost/SilverlightDBDemo.Web/DBService.svc"
17 binding="basicHttpBinding" bindingConfiguration=
"BasicHttpBinding_DBService"
18 contract="DBService.DBService" name=
"BasicHttpBinding_DBService" />
19 </client>
20 </system.serviceModel>
21 </configuration>
22
18. 下面我們將在客戶端調用該服務引用,獲取數據庫的返回值,根據返回值,我們將簡單判斷登錄是否成功。
進入MainPage.xaml.cs中,建立GetUser方法。該代碼中EndpointAddress是最重要的,出現沒有發現遠程服務器錯誤,和這里設置也有關系。在client_GetUserCompleted中,e.Result代表了數據庫返回值??梢越邮苋魏沃担蠹铱梢愿鶕枰M行值類型轉換。每次,用戶點擊登陸按鈕,Silverlight客戶端都會向服務器端請求驗證,返回結果會在提示信息欄顯示。
1 private void GetUser()
2 {
3 EndpointAddress address = new EndpointAddress(new Uri(Application.Current.Host.Source, "/SilverlightDBDemo.Web/DBService.svc"));
4 DBServiceClient client = new DBServiceClient(new BasicHttpBinding(), address);
5 client.GetUserCompleted += client_GetUserCompleted;
6 client.GetUserAsync(txtUsername.Text, pbPassword.Password);
7 }
8
9private void client_GetUserCompleted(object sender,
GetUserCompletedEventArgs e)
10 {
11 try
12 {
13 if (e.Result)
14 {
15 tbMessage.Text = "登錄成功!";
16 }
17 else
18 {
19 tbMessage.Text = "登錄失敗!";
20 }
21 }
22 catch (Exception error)
23 {
24 tbMessage.Text = error.ToString();
25 }
26 }
27
28 private void btLogin_Click(object sender, RoutedEventArgs e)
29 {
30 GetUser();
31 }
登錄成功如下圖:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網