在调用“添加适配器服务引用插件”中的Strongly-Typed 过程节点下列出的过程时,输出是以强类型结果集的形式呈现的。 本主题提供有关如何创建 WCF 客户端以调用 SQL Server 中返回强类型结果集的存储过程的说明。
注释
如果要对包含用户定义类型列的表执行操作,请确保在开始开发应用程序之前参考具有 User-Defined 类型的表和视图上的操作。
关于本主题中使用的示例
本主题中的示例使用GET_EMP_DETAILS存储过程。 此存储过程采用员工 ID 作为输入参数,并返回具有该 ID 的员工的所有相应列。 GET_EMP_DETAILS存储过程是通过运行随示例提供的 SQL 脚本创建的。 有关示例的详细信息,请参阅 适配器示例。 提供的 SQL 适配器示例中也包括一个基于本主题的示例 Execute_TypedStoredProcedure。
WCF 客户端类
下表中列出了使用 SQL 适配器在 Strongly-Typed Procedures 节点下调用存储过程时生成的 WCF 客户端的名称。
| SQL Server 数据库工件 | WCF 客户端名称 |
|---|---|
| 过程(在 “Strongly-Typed 过程 ”节点下) | TypedProcedures_[schema]Client |
[schema] 是过程所属的架构;例如“dbo”。
调用存储过程的方法签名
下表显示了公开用于调用存储过程的方法的签名。
| 操作 | 方法签名 |
|---|---|
| 过程名称 | [PROC_NS][procedure_name](param1、param2、...) |
[PROC_NS] 是过程命名空间。例如:schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[]
[procedure_name] 是过程的名称;例如GET_EMP_DETAILS
例如,调用GET_EMP_DETAILS过程的方法的签名显示在以下代码片段中。
public partial class TypedProcedures_dboClient : System.ServiceModel.ClientBase<TypedProcedures_dbo>, TypedProcedures_dbo{
public schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[]
GET_EMP_DETAILS(System.Nullable<int> emp_id, out int ReturnValue);
}
在此代码片段中,
TypedProcedures_dboClient是类的名称。 在此示例中,您可以使用此类来创建一个客户端,以调用存储过程。public schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[] GET_EMP_DETAILS(System.Nullable<int> emp_id, out int ReturnValue)是在此示例中调用的方法,用于调用存储过程。 此存储过程采用员工 ID 并返回强类型结果集。
创建 WCF 客户端以调用 SQL Server 中的存储过程
使用 WCF 客户端在 SQL Server 上执行作所需的泛型作集涉及使用 SQL 适配器的 WCF 服务模型概述中所述的一组任务。 本部分专门介绍如何创建一个 WCF 客户端来调用存储过程,并生成一个强类型的结果集。 在本主题中,您将调用例如GET_EMP_DETAILS的存储过程。 此存储过程是通过运行随每个示例提供的 SQL 脚本创建的。
在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。
为GET_EMP_DETAILS存储过程生成 WCF 客户端类。 请确保在 “Strongly-Typed 过程 ”节点下选择该过程。 有关生成 WCF 客户端类的详细信息,请参阅 为 SQL Server 项目生成 WCF 客户端或 WCF 服务协定。
重要
在生成 WCF 客户端类之前,请确保将 EnableBizTalkCompatibilityMode 绑定属性设置为 false。
在解决方案资源管理器中,添加对
Microsoft.Adapters.Sql和Microsoft.ServiceModel.Channels的引用。打开Program.cs文件并创建客户端,如以下代码片段中所述。
TypedProcedures_dboClient client = new TypedProcedures_dboClient("SqlAdapterBinding_TypedProcedures_dbo"); client.ClientCredentials.UserName.UserName = "<Enter username here>"; client.ClientCredentials.UserName.Password = "<Enter username here>";在此代码片段中,
TypedProcedures_dboClient是SqlAdapterBindingClient.cs中定义的 WCF 客户端。 此文件由“添加适配器服务引用插件”生成。SqlAdapterBinding_TypedProcedures_dbo是客户端终结点配置的名称,并在 app.config中定义。此文件也由添加适配器服务引用插件生成,并包含绑定属性和其他配置设置。注释
在此代码片段中,将使用配置文件中的绑定和终结点地址。 还可以在代码中显式指定这些值。 有关指定客户端绑定的不同方式的详细信息,请参阅 为 SQL 适配器配置客户端绑定。
按以下代码片段中所述打开客户端:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }调用GET_EMP_DETAILS存储过程,如以下代码片段中所述。
// Create array of type as specified in the method signature schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[] resultSet = new schemas.microsoft.com.Sql._2008._05.ProceduresResultSets.dbo.GET_EMP_DETAILS.StoredProcedureResultSet0[1]; int returnCode; try { Console.WriteLine("Calling a stored procedure..."); resultSet = client.GET_EMP_DETAILS(10001, out returnCode); //Invoke the stored procedure } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; } Console.WriteLine("The details for the employee with ID '10001' are:"); Console.WriteLine("*************************************************"); for (int i = 0; i < resultSet.Length; i++) { Console.WriteLine("Employee Name : " + resultSet[i].Name); Console.WriteLine("Employee Designation : " + resultSet[i].Designation); Console.WriteLine("Employee Salary : " + resultSet[i].Salary); } Console.WriteLine("*************************************************");按以下代码片段中所述关闭客户端:
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();生成项目,然后运行它。 员工 ID 的名称、指定和工资显示在主机上。