使用 WCF 服务模型在 SQL 中调用强类型存储过程

在调用“添加适配器服务引用插件”中的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 脚本创建的。

  1. 在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。

  2. 为GET_EMP_DETAILS存储过程生成 WCF 客户端类。 请确保在 “Strongly-Typed 过程 ”节点下选择该过程。 有关生成 WCF 客户端类的详细信息,请参阅 为 SQL Server 项目生成 WCF 客户端或 WCF 服务协定

    重要

    在生成 WCF 客户端类之前,请确保将 EnableBizTalkCompatibilityMode 绑定属性设置为 false。

  3. 在解决方案资源管理器中,添加对 Microsoft.Adapters.SqlMicrosoft.ServiceModel.Channels的引用。

  4. 打开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 适配器配置客户端绑定

  5. 按以下代码片段中所述打开客户端:

    try  
    {  
       Console.WriteLine("Opening Client...");  
       client.Open();  
    }  
    catch (Exception ex)  
    {  
       Console.WriteLine("Exception: " + ex.Message);  
       throw;  
    }  
    
  6. 调用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("*************************************************");  
    
    
  7. 按以下代码片段中所述关闭客户端:

    client.Close();  
    Console.WriteLine("Press any key to exit...");  
    Console.ReadLine();  
    
  8. 生成项目,然后运行它。 员工 ID 的名称、指定和工资显示在主机上。

另请参阅

使用 WCF 服务模型开发应用程序