Silverlight中連接MySQL數(shù)據(jù)庫實(shí)例詳解
本文將重點(diǎn)講述Silverlight中連接MySQL數(shù)據(jù)庫實(shí)例,這在RIA開發(fā)中比較基礎(chǔ),但是也是比較重要的內(nèi)容。希望通過本文能讓大家對(duì)連接MySQL有更深刻的理解。
#T#
在銀光中國網(wǎng)(SilverlightChina.Net)有一篇"Silverlight與常用數(shù)據(jù)庫互操作系列"文章,其中介紹了使用Silverlight存取不同數(shù)據(jù)庫的方法和步驟。但是對(duì)于Silverlight存取MS SQL介紹的不夠全面,這里我想介紹Silverlight如何通過WCF訪問MSSQL數(shù)據(jù)庫存儲(chǔ)過程的。希望對(duì)大家能夠有所幫助。
我們要實(shí)現(xiàn), 用戶輸入用戶名和密碼后,點(diǎn)擊登錄按鈕,傳遞用戶名和密碼到服務(wù)器端, 通過WCF訪問MSSQL數(shù)據(jù)庫,調(diào)用存儲(chǔ)過程,在服務(wù)器端對(duì)用戶名和密碼進(jìn)行匹配,匹配成功,則返回登錄成功,否則,則是失敗。
在文章開始前,我們需要做一下準(zhǔn)備工作,
開發(fā)環(huán)境需求: VS2008 SP1, Silverlight 3 Develop Tools for VS2008 SP1, 客戶端Silverlight 3 Runtime, MSSQL 2005 SP3 ;
建立例程數(shù)據(jù)庫 SilverlightDemo,在數(shù)據(jù)庫中建立一個(gè)新表 Users,包含以下字段;
添加內(nèi)容到Users表,為了方便起見,密碼全部使用明文,在正式項(xiàng)目中,建議對(duì)密碼字段進(jìn)行加密使用。
這里,我們驗(yàn)證用戶名和密碼,有兩種簡單方式,
一是使用存儲(chǔ)過程讀取用戶名和密碼,然后在服務(wù)器端進(jìn)行用戶名和密碼匹配校驗(yàn),如果查找到匹配數(shù)據(jù),則返回登錄成功,否則,則是登錄失敗;
二是傳用戶名和密碼到存儲(chǔ)過程中,在數(shù)據(jù)庫存儲(chǔ)過程中進(jìn)行判斷,使用Select語句進(jìn)行查找,對(duì)應(yīng)用戶名和密碼,如果查找到匹配結(jié)果,則返回用戶ID, 服務(wù)器端接收到用戶ID,則返回登錄成功,否則,則是失??;
在本例中,主要是對(duì)Silverlight訪問數(shù)據(jù)庫進(jìn)行講述,所以,對(duì)于驗(yàn)證方法,不進(jìn)行詳細(xì)描述和講解,如果有問題,可以留言給我,我們繼續(xù)討論,這里,我將使用第一種驗(yàn)證方法。 為此,建立一個(gè)簡單的存儲(chǔ)過程:
- CREATE PROCEDURE [dbo].[Login]
- ( @UserName Varchar(30))
- AS
- Select cUserName, cPassword
- From Users
- Where cUserName = @UserName
- RETURN
- SET NOCOUNT ON
在完成上面的準(zhǔn)備工作后,開始建立新的Silverlight項(xiàng)目,
1. 建立一個(gè)新項(xiàng)目"SilverlightDBDemo",
2. 在MainPage中建立簡單的登錄界面,如下:
3. 在Web項(xiàng)目中添加新選項(xiàng)
4. 添加一個(gè)簡單的用戶信息類Users,作為WCF的契約成員,當(dāng)我們從數(shù)據(jù)庫中讀取信息后,將賦值給該類的契約成員,方便客戶端進(jìn)行調(diào)用;
VS2008將自動(dòng)生成Users類代碼,在類命名前添加數(shù)據(jù)契約屬性[DataContract()]。 為了能夠使綁定數(shù)據(jù)返回修改通知,這里需要繼承INotifyPropertyChanged接口,該步驟不添加對(duì)本教程也沒有影響,為了以后例程代碼完整性,這里我繼承了該接口。在接口上點(diǎn)擊右鍵,生成代碼。
代碼如下:
- 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. 建立構(gòu)造函數(shù) 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",修改服務(wù)名字為 DBService.svc,需要注意的是,WCF service對(duì)于Silverlight僅支持BasicHttpBinding,而VS2008自動(dòng)生成是customBinding,很多朋友說使用了"Silverlight-enabled WCF Service",鏈接數(shù)據(jù)庫仍舊失敗,無法找到遠(yuǎn)程服務(wù)器,是因?yàn)闆]有使用BasicHttpBinding進(jìn)行通訊,造成的失敗。
后文我將講述如何修改。
8. 添加后,在Web服務(wù)器端會(huì)有DBService.svc和DBService.svc.cs文件出現(xiàn),VS2008將自動(dòng)更新Web項(xiàng)目的類庫引用;
9. 雙擊進(jìn)入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命名空間,所以保持默認(rèn)為空,AspNet的兼容需求模式我們保持默認(rèn)。在正式項(xiàng)目中,我們習(xí)慣將所有的[OperationContract]函數(shù)放入一個(gè)接口文件中,這樣方便擴(kuò)展以及維護(hù),在本例,為了方便大家理解,就不把[OperationContract]放入接口文件。 在VS2008自動(dòng)生成代碼下面直接添加數(shù)據(jù)庫訪問代碼。
10. 在添加服務(wù)器端數(shù)據(jù)庫訪問代碼前,需要修改Web.Config文件。和Asp.Net項(xiàng)目一樣,在鏈接數(shù)據(jù)庫前,我們首先需要在Web.Config中配置數(shù)據(jù)庫連接字符串,請(qǐng)自行替換數(shù)據(jù)庫登錄ID和密碼
- <appSettings>
- <add key="DbServiceConnectionString" value="Data Source=(Local);
- Initial Catalog=SilverlightDemo;
- User Id=dev;Password=dev;"/>
- </appSettings>
11. 前文已經(jīng)說過,Silverlight僅支持使用BasicHttpBinding通過WCF service進(jìn)行通訊,而VS2008自動(dòng)生成的代碼是customBinding,所以,我們也需要在Web.Config中進(jìn)行修改.下面是VS2008自動(dòng)生成的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>
-->這里我們需要修改以下幾個(gè)地方:
首先刪除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之類的屬性可以刪除,但是如果讀取數(shù)據(jù)庫中的大型表格,就需要設(shè)置緩沖池之類的尺寸了。這里,我們已經(jīng)使用了basicHttpBinding. Binding name我使用了BasicHttpBinding_DBService,大家可以隨意更換,下面將用到。
然后修改22行和23行的代碼,將endpoint中的binding,內(nèi)容修改為basicHttpBinding,bindingConfiguration的內(nèi)容修改為BasicHttpBinding_DBService。
- <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_DBService"
- contract="SilverlightDBDemo.Web.DBService" />
12. 現(xiàn)在我們可以在DBService.svc.cs中添加存取數(shù)據(jù)庫代碼,對(duì)用戶名和密碼進(jìn)行簡單匹配,這里不再著重講述如何條件匹配登錄信息。這里演示了如何調(diào)用數(shù)據(jù)庫存儲(chǔ)過程。完成存取數(shù)據(jù)庫代碼后,成功編譯Web項(xiàng)目。代碼有點(diǎn)長,這里折疊起來。
- 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客戶端,點(diǎn)擊右鍵添加服務(wù)引用
14. 在彈出窗口中,點(diǎn)擊"Discover",查找本地WCF service。在地址欄會(huì)自動(dòng)搜索到本地的Service引用,在Services樹形框中我們可以看到,在服務(wù)器端建立的DBService.svc,雙擊打開,可以看到,我們建立的GetUser函數(shù),以及默認(rèn)的DoWork函數(shù)。修改下面的命名空間為"DBService",方便調(diào)用。
15. 點(diǎn)擊"Advanced.."高級(jí)按鈕,確認(rèn)選中"Reuse types in referenced assembiles",如下圖,
16. 然后,點(diǎn)擊確定,會(huì)在客戶端中生成DBService服務(wù)引用。
17. 在生成DBService服務(wù)引用后,VS2008會(huì)自動(dòng)生成一個(gè)ServiceReferences.ClientConfig文件。
我們需要留意查看一下該文件內(nèi)容。其中,bindings信息是basicHttpBinding,而endpoint內(nèi)容和Web.Config中的內(nèi)容相同。這里我們不需要修改任何代碼。
- <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. 下面我們將在客戶端調(diào)用該服務(wù)引用,獲取數(shù)據(jù)庫的返回值,根據(jù)返回值,我們將簡單判斷登錄是否成功。
進(jìn)入MainPage.xaml.cs中,建立GetUser方法。該代碼中EndpointAddress是最重要的,出現(xiàn)沒有發(fā)現(xiàn)遠(yuǎn)程服務(wù)器錯(cuò)誤,和這里設(shè)置也有關(guān)系。在client_GetUserCompleted中,e.Result代表了數(shù)據(jù)庫返回值??梢越邮苋魏沃?,大家可以根據(jù)需要進(jìn)行值類型轉(zhuǎn)換。每次,用戶點(diǎn)擊登陸按鈕,Silverlight客戶端都會(huì)向服務(wù)器端請(qǐng)求驗(yàn)證,返回結(jié)果會(huì)在提示信息欄顯示。
- 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();
- }
到這里為止,我想你已經(jīng)學(xué)會(huì)了如何使用WCF存取MSSQL數(shù)據(jù)庫了
原文標(biāo)題:圖文詳解Silverlight訪問MSSQL數(shù)據(jù)庫
鏈接:http://www.cnblogs.com/jv9/archive/2009/12/30/1635655.html