本文将建立一个最简单的WCF RIA Services访问数据库的实例,附带有数据库文件,可以在Sql Server中附加数据库,在本文中并没有采用ADO.NET实体数据模型绑定数据库,而是单独写一个类来连接数据库查询数据表并返回值,下面我们看详细 步骤。

        第一步:首先我们打开VS2010,新建一个Silverlight应用程序项目SLGetDataFromWCFRIA。

        第二步:点击确定之后,在弹出的“新建Silverlight应用程序”窗口中,选中“启用 WCF RIA 服务”复选框然后确定。

        第三步:在创建好的项目中,鼠标右键点击“SLGetDataFromWCFRIA.Web”项目,然后“添加”-->“新建项”-->“WCF服务”,命名为SLWCFRIA.svc。

        第四步:在上一步生成的ISLWCFRIA.cs文件中,我们可以定义相关的通信的契约,在本实例中我们定义一个string GetData()契约。

        第五步:在SLWCFRIA.svc.cs文件中我们实现这个契约函数,代码如下:

 

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Runtime.Serialization; 
  5. using System.ServiceModel; 
  6. using System.Text; 
  7. using System.Data; 
  8. using System.Data.SqlClient; 
  9.  
  10. namespace SLGetDataFromWCFRIA.Web 
  11. // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“SLWCFRIA”。 
  12. public class SLWCFRIA : ISLWCFRIA 
  13. public void DoWork() 
  14. public string GetData() 
  15. DataSet ds= DB.Getdata("select * from userinfo"); 
  16. return ds.GetXml(); 

        第七步:我们在SQL SERVER2008中创建一个示例数据库名为SLRiaTest。在这个数据库里面新增一个UserInfo表,在里面添加字段如下:

        第八步:编写一个类,来连接SLRiaTest数据库,获取DataSet数据集。

DB.cs数据库访问类

  1. /// <summary> 
  2.    /// DB 的摘要说明 
  3.    /// </summary> 
  4.    public   class  DB 
  5.    { 
  6.        private static IsolationLevel m_isoLevel = IsolationLevel.ReadUncommitted; 
  7.        private static string connStr = string.Empty; 
  8.  
  9.        private DB() 
  10.        { 
  11.        } 
  12.  
  13.        #region DB2 Access Functions 
  14.  
  15.        static public IsolationLevel IsolationLevel 
  16.        { 
  17.            get 
  18.            { 
  19.                return m_isoLevel; 
  20.            } 
  21.        } 
  22.  
  23.        /// <summary> 
  24.        /// Gets Connection out of Web.config 
  25.        /// </summary> 
  26.        /// <returns>Returns SqlConnection</returns
  27.        public static SqlConnection GetConnection() 
  28.        { 
  29.            if (connStr == string.Empty) 
  30.            { 
  31.                AppSettingsReader configurationAppSettings = new AppSettingsReader(); 
  32.                connStr = "Data Source=CXL-DC6F5F6CA80;POOLING=FALSE;database=SLRiaTest;User ID=sa;Password=123456"
  33.            } 
  34.  
  35.            SqlConnection conn = new SqlConnection(connStr); 
  36.            conn.Open(); 
  37.            return conn; 
  38.        } 
  39.  
  40.        /// <summary> 
  41.        /// Gets data out of database using a plain text string command 
  42.        /// </summary> 
  43.        /// <param name="sql">string command to be executed</param> 
  44.        /// <returns>DataTable with results</returns
  45.        static public DataSet Getdata(string sql) 
  46.        { 
  47.            using (SqlConnection conn = GetConnection()) 
  48.            { 
  49.                using (SqlTransaction trans = conn.BeginTransaction(m_isoLevel)) 
  50.                { 
  51.                    try 
  52.                    { 
  53.                        using (SqlCommand cmd = conn.CreateCommand()) 
  54.                        { 
  55.                            if (sql != null
  56.                            { 
  57.                                sql = sql.ToLower().Replace("<;""");//.Replace(Convert.ToChar(32).ToString(), "&nbsp;").Replace(" ""&nbsp;").Replace("%32""&nbsp;").Replace("%20""&nbsp;"); 
  58.                                sql = sql.Replace(">;"""); 
  59.                                sql = sql.Replace("script"""); 
  60.                                sql = sql.Replace("object"""); 
  61.                                sql = sql.Replace("applet"""); 
  62.                                sql = sql.Replace("["""); 
  63.                                sql = sql.Replace("]"""); 
  64.                                sql = sql.Replace("execute"""); 
  65.                                sql = sql.Replace("exec"""); 
  66.                                sql = sql.Replace("union"""); 
  67.                                sql = sql.Replace("drop"""); 
  68.                                sql = sql.Replace("delete"""); 
  69.                                //  sql = sql.Replace("chr"""); 
  70.                                //sql = sql.Replace("mid"""); 
  71.                                sql = sql.Replace("truncate"""); 
  72.                                sql = sql.Replace("nchar"""); 
  73.                                //  sql = sql.Replace("varchar"""); 
  74.                                //sql = sql.Replace("char"""); 
  75.                                sql = sql.Replace("alter"""); 
  76.                                // sql = sql.Replace("cast"""); 
  77.                                sql = sql.Replace("exists"""); 
  78.                                sql = sql.Replace("update"""); 
  79.                            } 
  80.                            cmd.Transaction = trans; 
  81.                            cmd.CommandType = CommandType.Text; 
  82.                            cmd.CommandText = sql; 
  83.                            using (DataSet ds = new DataSet()) 
  84.                            { 
  85.                                using (SqlDataAdapter da = new SqlDataAdapter()) 
  86.                                { 
  87.                                    da.SelectCommand = cmd; 
  88.                                    da.SelectCommand.Connection = conn; 
  89.                                    da.Fill(ds); 
  90.                                    return ds; 
  91.                                } 
  92.                            } 
  93.                        } 
  94.                    } 
  95.                    finally 
  96.                    { 
  97.                        trans.Commit(); 
  98.                    } 
  99.                } 
  100.            } 
  101.        } 
  102.  
  103.        #endregion 
  104.  
  105.    } 

        第九步:鼠标右键点击SLGetDataFromWCFRIA项目“添加服务引用”即引用刚才我们编写的WCF服务。

        第十步:添加一个UserInfo的实体类集合。代码如下:

 

  1. /// <summary> 
  2.     /// 用户实体类 
  3.     /// </summary> 
  4.     public class UserInfo 
  5.     { 
  6.         private string _ID; 
  7.         private string _UserName; 
  8.         private string _UserAddr; 
  9.         private string _UserTel; 
  10.  
  11.         public string ID 
  12.         { 
  13.             get { return _ID; } 
  14.             set { _ID = value; } 
  15.         } 
  16.  
  17.         public string UserName 
  18.         { 
  19.             get { return _UserName; } 
  20.             set { _UserName = value; } 
  21.         } 
  22.  
  23.         public string UserAddr 
  24.         { 
  25.             get { return _UserAddr; } 
  26.             set { _UserAddr = value; } 
  27.         } 
  28.  
  29.         public string UserTel 
  30.         { 
  31.             get { return _UserTel; } 
  32.             set { _UserTel = value; } 
  33.         } 
  34.     } 

        第十一步:点击MainPage.xaml文件,添加一个DataGird控件命名为grShow,在MainPage.xaml.cs文件中编写以下代码获取WCF RIA services读取到的数据库数据:

 

  1. public partial class MainPage : UserControl 
  2.   { 
  3.       public MainPage() 
  4.       { 
  5.           InitializeComponent(); 
  6.           //创建一个代理类的实例 
  7.           SLWCFRIAClient client = new SLWCFRIAClient(); 
  8.           //调用GetData方法并加载事件 
  9.           client.GetDataAsync(); 
  10.           client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(client_GetDataCompleted); 
  11.       } 
  12.       public  List<UserInfo> userList = new List<UserInfo>(); 
  13.       void client_GetDataCompleted(object sender, GetDataCompletedEventArgs e) 
  14.       { 
  15.           using (XmlReader xReader = XmlReader.Create(new StringReader(e.Result))) 
  16.           { 
  17.               //XmlReader读取XML数据 
  18.               while (xReader.ReadToFollowing("Table")) 
  19.               { 
  20.                   xReader.ReadToDescendant("ID"); 
  21.                   string id = xReader.ReadElementContentAsString(); 
  22.                   xReader.ReadToNextSibling("UserName"); 
  23.                   string username = xReader.ReadElementContentAsString(); 
  24.  
  25.                   xReader.ReadToNextSibling("UserAddr"); 
  26.                   string useraddr = xReader.ReadElementContentAsString(); 
  27.  
  28.                   xReader.ReadToNextSibling("UserTel"); 
  29.                   string usertel = xReader.ReadElementContentAsString(); 
  30.                   //实例化类并添加进实体类List<> 
  31.                   UserInfo uinfo = new UserInfo(){ID=id, UserName=username,UserAddr=useraddr,UserTel=usertel}; 
  32.                   userList.Add(uinfo); 
  33.               } 
  34.               this.grShow.ItemsSource = userList; 
  35.           } 
  36.  
  37.       } 
  38.   } 

        最后我们看最后的效果图,本实例采用VS2010+Silverlight 4.0+MS SQL SERVER 2008,点击 SLGetDataFromWCFRIA.rar 下载本实例源码和示例数据库。