使用WCF从SilverLight连接SQL Server的7个简单步骤






4.84/5 (25投票s)
在本文中,我们将介绍如何使用 Silverlight 进行数据库操作。
更新:已将 Silverlight 常见问题解答 - 第三部分链接和视频添加到本文。
使用WCF从SilverLight连接SQL Server的7个简单步骤
引言和目标
在本文中,我们将介绍如何使用 Silverlight 进行数据库操作。我们首先尝试理解为什么不能直接从 Silverlight 应用程序调用 ADO.NET,然后我们将浏览需要遵循的 7 个步骤,以便从 Silverlight 进行数据库操作。
我收集了 WCF、WPF、WWF、SharePoint、设计模式、UML 等方面的约 400 个常见问题解答。欢迎从我的网站下载这些常见问题解答 PDF。
Silverlight 没有 ADO.NET
以下是构成 Silverlight 插件的各种组件。需要注意的一个重要点是它不包含 ADO.NET。换句话说,您不能直接从 Silverlight 应用程序调用 ADO.NET 代码。现在需要注意的另一点是它包含 WCF 组件。换句话说,您可以调用 WCF 服务。
换句话说,您可以创建一个执行数据库操作的 WCF 服务,Silverlight 应用程序将调用该服务。另一点需要注意的重要事项是不要返回数据集等 ADO.NET 对象,因为 Silverlight 将无法理解它们。
以下是我们要在 Silverlight 中使用数据库 WCF 服务所需的 7 个重要步骤。
步骤 1:创建服务和数据服务契约
下面是一个简单的客户表,它有 3 个字段:‘CustomerId
’(标识列)、‘CustomerCode
’(包含客户代码)和‘CustomerName
’(包含客户姓名)。我们将使用 WCF 执行一个简单的 SELECT 查询,然后在 Silverlight 网格上显示数据。
字段 | 数据类型 |
CustomerId | int |
CustomerCode | nvarchar(50) |
CustomerName | nvarchar(50) |
根据上面指定的客户表,我们需要首先定义 WCF 数据契约。以下是客户 WCF 数据契约。
[DataContract]
public class clsCustomer
{
private string _strCustomer;
private string _strCustomerCode;
[DataMember]
public string Customer
{
get { return _strCustomer; }
set { _strCustomer = value; }
}
[DataMember]
public string CustomerCode
{
get { return _strCustomerCode; }
set { _strCustomerCode = value; }
}
}
我们还需要定义一个 WCF 服务契约,它将由 WCF 具体类实现。
[ServiceContract]
public interface IServiceCustomer
{
[OperationContract]
clsCustomer getCustomer(int intCustomer);
}
步骤 2:编写 WCF 服务代码
现在我们已经定义了数据契约和服务契约,是时候实现服务契约了。我们实现了 ‘getCustomer
’ 函数,该函数将返回 ‘clsCustomer
’ 数据契约。‘getCustomer
’ 函数建立一个简单的 ADO.NET 连接,并使用 ‘Select
’ SQL 查询检索客户信息。
public class ServiceCustomer : IServiceCustomer
{
public clsCustomer getCustomer(int intCustomer)
{
SqlConnection objConnection = new SqlConnection();
DataSet ObjDataset = new DataSet();
SqlDataAdapter objAdapater = new SqlDataAdapter();
SqlCommand objCommand = new SqlCommand
("Select * from Customer where CustomerId=" + intCustomer.ToString());
objConnection.ConnectionString =
System.Configuration.ConfigurationManager.ConnectionStrings
["ConnStr"].ToString();
objConnection.Open();
objCommand.Connection = objConnection;
objAdapater.SelectCommand = objCommand;
objAdapater.Fill(ObjDataset);
clsCustomer objCustomer = new clsCustomer();
objCustomer.CustomerCode = ObjDataset.Tables[0].Rows[0][0].ToString();
objCustomer.Customer = ObjDataset.Tables[0].Rows[0][1].ToString();
objConnection.Close();
return objCustomer;
}
}
步骤 3:复制 CrossDomain.xml 和 ClientAccessPolicy.XML 文件
此 WCF 服务将从外部域调用,因此我们需要通过创建 ‘CrossDomain.xml’ 和 ‘ClientAccessPolicy.xml’ 来启用 WCF 服务中的跨域策略。以下是两个代码片段。第一个代码片段用于跨域,第二个用于客户端访问策略。
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource include-subpaths="true" path="/"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>
步骤 4:将 WCF 绑定更改为 ‘basicHttpBinding’
Silverlight 仅消耗和生成 basicHttpBinding
的代理,因此我们需要相应地更改终结点绑定。
<endpoint address="" binding="basicHttpBinding"
contract="WCFDatabaseService.IServiceCustomer">
步骤 5:添加服务引用
我们需要使用“添加服务引用”菜单在 Silverlight 应用程序中消耗服务引用。因此,右键单击 Silverlight 项目并选择“添加服务引用”。
步骤 6:定义客户名称和客户代码的 Grid
现在在 Silverlight 端,我们将创建一个‘Grid
’,其中包含两列,一列用于‘CustomerCode
’,另一列用于‘CustomerName
’。我们还通过在文本块中使用‘Binding path’指定了绑定。
<Grid x:Name="LayoutRoot" Background="White">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="20"></RowDefinition>
<RowDefinition Height="20"></RowDefinition>
</Grid.RowDefinitions>
<TextBlock x:Name="LblCustomerCode" Grid.Column="0"
Grid.Row="0" Text="Customer Code"></TextBlock>
<TextBlock x:Name="TxtCustomerCode" Grid.Column="1"
Grid.Row="0" Text="{Binding Path=CustomerCode}"></TextBlock>
<TextBlock x:Name="LblCustomerName" Grid.Column="0"
Grid.Row="1" Text="Customer Name"></TextBlock>
<TextBlock x:Name="TxtCustomerName" Grid.Column="1"
Grid.Row="1" Text="{Binding Path=Customer}"></TextBlock>
</Grid>
步骤 7:将 WCF 服务绑定到 GRID
现在我们的网格已创建,是时候将 WCF 服务与网格绑定了。因此,转到 XAML 文件的代码隐藏并创建 WCF 服务对象。从 Silverlight 调用 WCF 服务时,需要注意两个重要点:
- 我们需要异步调用 WCF,因此我们调用了
getCustomerAsynch
。请注意,此函数由 WCF 服务创建,用于对方法/函数进行异步调用。 - 一旦函数在 WCF 服务上完成其工作,它会将消息回传给 Silverlight 客户端。因此,我们需要某种委托方法来促进这种通信。您可以看到我们创建了一个
getCustomerCompleted
方法,该方法捕获参数并将结果与网格datacontext
关联。
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
ServiceCustomerClient obj = new ServiceCustomerClient();
obj.getCustomerCompleted += new EventHandler<getCustomerCompletedEventArgs>
(DisplayResults);
obj.getCustomerAsync(1);
}
void DisplayResults(object sender, getCustomerCompletedEventArgs e)
{
LayoutRoot.DataContext = e.Result;
}
}
您现在可以运行项目,查看 Silverlight 客户端如何消耗和显示数据。
其他 Silverlight 常见问题解答
- Silverlight 常见问题解答 第一部分:本教程包含 21 个基本常见问题解答,将帮助您理解 WPF、XAML,帮助您构建第一个 Silverlight 应用程序,并解释整体 Silverlight 架构。
- Silverlight 常见问题解答 第二部分(动画和变换):本教程包含 10 个常见问题解答,从 Silverlight 动画基础开始,然后展示一个简单的动画矩形。然后,文章继续讨论了对象的 4 种不同变换方法。
- Silverlight 常见问题解答 第三部分:本文讨论了 12 个常见问题解答,围绕绑定、布局、使用 WCF 服务以及如何通过 Silverlight 连接数据库。
如需进一步阅读,请观看以下面试准备视频和分步视频系列。