当前位置:首页 > 问答 > 正文

Silverlight怎么快速搞定和SQL数据库的连接,简单又实用的方法分享

Silverlight作为一个客户端技术,它不能,也绝对不应该直接连接SQL数据库,如果你在网上看到任何教你直接在Silverlight代码里写连接字符串,像Windows程序那样连数据库的文章,请立刻关掉它,那是非常错误且危险的做法,原因很简单:把你的数据库服务器地址、用户名和密码写在Silverlight这个最终要运行在用户浏览器里的客户端程序中,就相当于把自家大门的钥匙挂在门口,任何人都能拿到,安全风险极大。

正确、快速且实用的方法是什么呢?答案是:通过一个中间层服务,Silverlight去跟这个服务打交道,而这个服务再去连接和操作数据库,这样就把敏感的数据库信息保护在了服务器端,用户接触不到,这个中间层服务,就像是Silverlight和数据库之间的一个“翻译官”和“保安”。

分享两种最常用、也相对简单实用的方法。

使用WCF服务(这是最正统和主流的方式)

WCF(Windows Communication Foundation)是微软推出的一套构建服务导向应用程序的框架,对于Silverlight来说,有一种专门优化过的服务类型叫“WCF RIA Services”,但咱们先从基本的WCF服务说起,这个更通用。

步骤非常简单:

  1. 在服务器端创建WCF服务: 在你的Silverlight项目所在的Web项目(比如那个XXX.Web项目)里,右键添加新项,选择“Silverlight-enabled WCF Service”,这个模板是专门为Silverlight配置好的,省去了很多麻烦的配置。
  2. 在服务里写数据库操作代码: 在这个新创建的WCF服务文件(.svc)的后台代码里,你就可以像在普通ASP.NET程序里那样,使用ADO.NET(比如SqlConnection, SqlCommand)或者Entity Framework等ORM工具来编写连接和查询数据库的方法,你可以写一个GetUsers方法,返回一个用户列表。 参考来源:微软官方MSDN文档中关于创建Silverlight可调用WCF服务的指南。
  3. 在Silverlight客户端添加服务引用: 编译一下Web项目,在你的Silverlight客户端项目中,右键点击“添加服务引用”,点击“发现”,你应该就能看到刚才创建的那个WCF服务,给它起个名字(DatabaseService”),然后确定,Visual Studio会自动为你生成一堆代理类代码。
  4. 在Silverlight中调用服务: 你在Silverlight的页面代码(比如按钮点击事件里)就可以像下面这样调用了:
    // 实例化服务的客户端代理
    var client = new DatabaseServiceClient();
    // 调用服务端定义的方法,比如GetUsers
    client.GetUsersCompleted += (s, e) => {
        if (e.Error == null) {
            // e.Result 就是服务端返回的用户列表
            myDataGrid.ItemsSource = e.Result;
        } else {
            // 处理错误
            MessageBox.Show("获取数据失败!");
        }
    };
    client.GetUsersAsync(); // 异步调用

    参考来源:众多Silverlight入门教程和项目实践中的标准做法。

    Silverlight怎么快速搞定和SQL数据库的连接,简单又实用的方法分享

为什么这个方法实用?

  • 安全: 数据库连接字符串安全地待在服务器上。
  • 标准: 这是微软官方推荐的主流方式,资料相对丰富。
  • 强大: 可以处理复杂的业务逻辑和数据交换。

小提示: 异步调用是Silverlight的核心特性之一,为了不阻塞UI线程,保持界面流畅,所有服务调用都必须是异步的,所以你会看到GetUsersAsync方法和GetUsersCompleted事件。

使用一般的ASP.NET Web服务(ASMX)

如果你的需求非常简单,或者你觉得WCF配置起来有点复杂,那么老牌的ASP.NET Web服务(ASMX)也是一个不错的选择,它在简单性上有优势。

Silverlight怎么快速搞定和SQL数据库的连接,简单又实用的方法分享

步骤同样清晰:

  1. 在服务器端创建Web服务: 在Web项目中,添加新项,选择“Web服务(ASMX)”。
  2. 编写方法: 在服务代码里,给方法加上[WebMethod]特性,在里面写你的数据库操作代码,这和WCF服务里的步骤几乎一样。
  3. 在Silverlight中添加服务引用: 过程和添加WCF服务引用完全一样,右键项目,“添加服务引用”,点击“发现”,VS也能识别ASMX服务并生成代理。
  4. 调用方式: 调用代码的写法和方法一极其相似,也是异步模式:client.GetUsersAsync()client.GetUsersCompleted事件。

方法一和方法二怎么选?

  • 对于新项目,建议优先选择WCF服务,因为它更现代,功能更全面,尤其是在需要处理复杂数据契约和安全性时。
  • 如果只是实现一两个简单的查询功能,用ASMX服务更快上手,配置更少。

一些通用的实用技巧和注意事项

  1. 错误处理要到位: 在客户端的Completed事件里,一定要检查e.Error属性,网络请求不稳定,任何错误都可能发生,给用户一个友好的提示非常重要。
  2. 数据序列化: 你的服务返回的自定义对象(比如一个User类),需要能够被序列化(通常加上[DataContract][DataMember]特性),才能在网络上从服务端传递到客户端,VS在生成服务引用时通常会帮你处理,但了解这个原理有助于排错。
  3. 连接字符串配置: 服务端数据库的连接字符串应该放在Web.config文件里,而不是硬编码在代码中,方便后期维护和变更。
  4. 考虑使用Entity Framework: 在服务端操作数据库时,强烈推荐使用Entity Framework这样的ORM工具,它会让你写数据库代码像操作普通对象一样简单,大大提升开发效率,你只需要在服务方法里查询EF的DbSet,然后返回结果即可,WCF/ASMX服务会自动帮你序列化传输。 参考来源:社区普遍认为在.NET生态中,EF能显著简化数据访问层开发。

总结一下核心思想:

忘掉“Silverlight直连数据库”这个念头,你的正确路径是:Silverlight客户端 -> 异步调用 -> 服务器端的WCF或ASMX服务 -> 服务连接并操作数据库 -> 返回结果给Silverlight。

这个方法既安全又符合Silverlight的设计哲学,通过练习,你会发现搭建起这个通信桥梁并不困难,希望这些直接了当的分享能帮你快速搞定Silverlight和数据库的连接问题。