Silverlight中連接MySQL數據庫實例詳解
本文將重點講述Silverlight中連接MySQL數據庫實例,這在RIA開發中比較基礎,但是也是比較重要的內容。希望通過本文能讓大家對連接MySQL有更深刻的理解。
#T#
在銀光中國網(SilverlightChina.Net)有一篇"Silverlight與常用數據庫互操作系列"文章,其中介紹了使用Silverlight存取不同數據庫的方法和步驟。但是對于Silverlight存取MS SQL介紹的不夠全面,這里我想介紹Silverlight如何通過WCF訪問MSSQL數據庫存儲過程的。希望對大家能夠有所幫助。
我們要實現, 用戶輸入用戶名和密碼后,點擊登錄按鈕,傳遞用戶名和密碼到服務器端, 通過WCF訪問MSSQL數據庫,調用存儲過程,在服務器端對用戶名和密碼進行匹配,匹配成功,則返回登錄成功,否則,則是失敗。
在文章開始前,我們需要做一下準備工作,
開發環境需求: VS2008 SP1, Silverlight 3 Develop Tools for VS2008 SP1, 客戶端Silverlight 3 Runtime, MSSQL 2005 SP3 ;
建立例程數據庫 SilverlightDemo,在數據庫中建立一個新表 Users,包含以下字段;
添加內容到Users表,為了方便起見,密碼全部使用明文,在正式項目中,建議對密碼字段進行加密使用。
這里,我們驗證用戶名和密碼,有兩種簡單方式,
一是使用存儲過程讀取用戶名和密碼,然后在服務器端進行用戶名和密碼匹配校驗,如果查找到匹配數據,則返回登錄成功,否則,則是登錄失敗;
二是傳用戶名和密碼到存儲過程中,在數據庫存儲過程中進行判斷,使用Select語句進行查找,對應用戶名和密碼,如果查找到匹配結果,則返回用戶ID, 服務器端接收到用戶ID,則返回登錄成功,否則,則是失敗;
在本例中,主要是對Silverlight訪問數據庫進行講述,所以,對于驗證方法,不進行詳細描述和講解,如果有問題,可以留言給我,我們繼續討論,這里,我將使用第一種驗證方法。 為此,建立一個簡單的存儲過程:
- CREATE PROCEDURE [dbo].[Login]
- ( @UserName Varchar(30))
- AS
- Select cUserName, cPassword
- From Users
- Where cUserName = @UserName
- RETURN
- SET NOCOUNT ON
在完成上面的準備工作后,開始建立新的Silverlight項目,
1. 建立一個新項目"SilverlightDBDemo",
2. 在MainPage中建立簡單的登錄界面,如下:
3. 在Web項目中添加新選項
4. 添加一個簡單的用戶信息類Users,作為WCF的契約成員,當我們從數據庫中讀取信息后,將賦值給該類的契約成員,方便客戶端進行調用;
VS2008將自動生成Users類代碼,在類命名前添加數據契約屬性[DataContract()]。 為了能夠使綁定數據返回修改通知,這里需要繼承INotifyPropertyChanged接口,該步驟不添加對本教程也沒有影響,為了以后例程代碼完整性,這里我繼承了該接口。在接口上點擊右鍵,生成代碼。
代碼如下:
- namespace SilverlightDBDemo.Web
- {
- [DataContract()]
- public class Users : INotifyPropertyChanged
- {
- #region INotifyPropertyChanged Members
- public event PropertyChangedEventHandler PropertyChanged;
- #endregion
- }
- }
5. 在Users類中,添加契約成員
- private string userName;
- [DataMember()]
- public string UserName
- {
- get { return userName; }
- set { userName = value;}
- }
- private string password;
- [DataMember()]
- public string Password
- {
- get { return password; }
- set { password = value; }
- }
6. 建立構造函數 public Users(string sUserName,string sPassword),傳遞用戶名和密碼給契約成員;
- using System;
- using System.ComponentModel;
- using System.Runtime.Serialization;
- namespace SilverlightDBDemo.Web
- {
- [DataContract()]
- public class Users : INotifyPropertyChanged
- {
- private string userName;
- [DataMember()]
- public string UserName
- {
- get { return userName; }
- set { userName = value;}
- }
- private string password;
- [DataMember()]
- public string Password
- {
- get { return password; }
- set { password = value; }
- }
- public Users(string sUserName,string sPassword)
- {
- UserName = sUserName;
- Password = sPassword;
- }
- #region INotifyPropertyChanged Members
- public event PropertyChangedEventHandler PropertyChanged;
- #endregion
- }
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文件,可以看到以下代碼:
- using System;
- using System.Linq;
- using System.Runtime.Serialization;
- using System.ServiceModel;
- using System.ServiceModel.Activation;
- using System.Collections.Generic;
- using System.Text;
- namespace SilverlightDBDemo.Web
- {
- [ServiceContract(Namespace = "")]
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class DBService
- {
- [OperationContract]
- public void DoWork()
- {
- // Add your operation implementation here
- return;
- }
- // Add more operations here and mark them with [OperationContract]
- }
- }
這里我們沒有修改ServiceContract命名空間,所以保持默認為空,AspNet的兼容需求模式我們保持默認。在正式項目中,我們習慣將所有的[OperationContract]函數放入一個接口文件中,這樣方便擴展以及維護,在本例,為了方便大家理解,就不把[OperationContract]放入接口文件。 在VS2008自動生成代碼下面直接添加數據庫訪問代碼。
10. 在添加服務器端數據庫訪問代碼前,需要修改Web.Config文件。和Asp.Net項目一樣,在鏈接數據庫前,我們首先需要在Web.Config中配置數據庫連接字符串,請自行替換數據庫登錄ID和密碼
- <appSettings>
- <add key="DbServiceConnectionString" value="Data Source=(Local);
- Initial Catalog=SilverlightDemo;
- User Id=dev;Password=dev;"/>
- </appSettings>
11. 前文已經說過,Silverlight僅支持使用BasicHttpBinding通過WCF service進行通訊,而VS2008自動生成的代碼是customBinding,所以,我們也需要在Web.Config中進行修改.下面是VS2008自動生成的Web.Config部分代碼,劃線部分是下面要修改的部分。
- <system.serviceModel>
- <behaviors>
- <serviceBehaviors>
- <behavior name="SilverlightDBDemo.Web.DBServiceBehavior">
- <serviceMetadata httpGetEnabled="true" />
- <serviceDebug includeExceptionDetailInFaults="False" />
- </behavior>
- </serviceBehaviors>
- </behaviors>
- <bindings>
- <customBinding>
- <binding name="customBinding0">
- <binaryMessageEncoding />
- <httpTransport />
- </binding>
- </customBinding>
- </bindings>
- <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
- <services>
- <service behaviorConfiguration="SilverlightDBDemo.Web.DBServiceBehavior"
- name="SilverlightDBDemo.Web.DBService">
- <endpoint address="" binding="customBinding" bindingConfiguration="customBinding0"
- contract="SilverlightDBDemo.Web.DBService" />
- <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
- </service>
- </services>
- </system.serviceModel>
-->這里我們需要修改以下幾個地方:
首先刪除customBinding,從上面代碼,第10行,到17行,使用下面代碼替換:
- <bindings>
- <basicHttpBinding>
- <binding name="BasicHttpBinding_IDataService"
- maxBufferPoolSize="2147483647"
- maxReceivedMessageSize="2147483647"
- maxBufferSize="2147483647">
- <readerQuotas
- maxArrayLength="2147483647"
- maxBytesPerRead="2147483647"
- maxDepth="2147483647"
- maxNameTableCharCount="2147483647"
- maxStringContentLength="2147483647" />
- </binding>
- </basicHttpBinding>
- </bindings>
其中那些2147483647之類的屬性可以刪除,但是如果讀取數據庫中的大型表格,就需要設置緩沖池之類的尺寸了。這里,我們已經使用了basicHttpBinding. Binding name我使用了BasicHttpBinding_DBService,大家可以隨意更換,下面將用到。
然后修改22行和23行的代碼,將endpoint中的binding,內容修改為basicHttpBinding,bindingConfiguration的內容修改為BasicHttpBinding_DBService。
- <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_DBService"
- contract="SilverlightDBDemo.Web.DBService" />
12. 現在我們可以在DBService.svc.cs中添加存取數據庫代碼,對用戶名和密碼進行簡單匹配,這里不再著重講述如何條件匹配登錄信息。這里演示了如何調用數據庫存儲過程。完成存取數據庫代碼后,成功編譯Web項目。代碼有點長,這里折疊起來。
- private string connectionString = WebConfigurationManager.AppSettings["DbServiceConnectionString"];
- [OperationContract]
- public bool GetUser(string cUserName, string cPassword)
- {
- SqlConnection conn = new SqlConnection(connectionString);
- SqlCommand cmd = new SqlCommand("Login", conn);
- cmd.CommandType = CommandType.StoredProcedure;
- cmd.Parameters.AddWithValue("@UserName", cUserName);
- try
- {
- conn.Open();
- SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow);
- if (reader.Read())
- {
- Users user = new Users((string)reader["cUserName"],
- (string)reader["cPassword"]);
- if (user.Password == cPassword)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- }
- finally
- {
- conn.Close();
- }
- }
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中的內容相同。這里我們不需要修改任何代碼。
- <configuration>
- <system.serviceModel>
- <bindings>
- <basicHttpBinding>
- <binding name="BasicHttpBinding_DBService" maxBufferSize="2147483647"
- maxReceivedMessageSize="2147483647">
- <security mode="None">
- <transport>
- <extendedProtectionPolicy policyEnforcement="Never" />
- </transport>
- </security>
- </binding>
- </basicHttpBinding>
- </bindings>
- <client>
- <endpoint address="http://localhost/SilverlightDBDemo.Web/DBService.svc"
- binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_DBService"
- contract="DBService.DBService" name="BasicHttpBinding_DBService" />
- </client>
- </system.serviceModel>
- </configuration>
18. 下面我們將在客戶端調用該服務引用,獲取數據庫的返回值,根據返回值,我們將簡單判斷登錄是否成功。
進入MainPage.xaml.cs中,建立GetUser方法。該代碼中EndpointAddress是最重要的,出現沒有發現遠程服務器錯誤,和這里設置也有關系。在client_GetUserCompleted中,e.Result代表了數據庫返回值。可以接受任何值,大家可以根據需要進行值類型轉換。每次,用戶點擊登陸按鈕,Silverlight客戶端都會向服務器端請求驗證,返回結果會在提示信息欄顯示。
- private void GetUser()
- {
- EndpointAddress address = new EndpointAddress(new Uri(Application.Current.Host.Source, "/SilverlightDBDemo.Web/DBService.svc"));
- DBServiceClient client = new DBServiceClient(new BasicHttpBinding(), address);
- client.GetUserCompleted += client_GetUserCompleted;
- client.GetUserAsync(txtUsername.Text, pbPassword.Password);
- }
- private void client_GetUserCompleted(object sender, GetUserCompletedEventArgs e)
- {
- try
- {
- if (e.Result)
- {
- tbMessage.Text = "登錄成功!";
- }
- else
- {
- tbMessage.Text = "登錄失敗!";
- }
- }
- catch (Exception error)
- {
- tbMessage.Text = error.ToString();
- }
- }
- private void btLogin_Click(object sender, RoutedEventArgs e)
- {
- GetUser();
- }
到這里為止,我想你已經學會了如何使用WCF存取MSSQL數據庫了
原文標題:圖文詳解Silverlight訪問MSSQL數據庫
鏈接:http://www.cnblogs.com/jv9/archive/2009/12/30/1635655.html