使用 WCF 服务模型调用 SQL Server 中的 Table-Valued 函数

可以使用 WCF 服务模型在 .NET 应用程序中使用 SQL 适配器来调用 SQL Server 中的表值函数。 适配器将表值函数公开为可以直接在 SQL Server 上调用的方法。 有关适配器如何支持标量函数的详细信息,请参阅 使用 SQL 适配器在 SQL Server 中执行 Table-Valued 函数

本主题演示如何在 SQL Server 数据库中调用TVF_EMPLOYEE函数。 TVF_EMPLOYEE函数使用Employee 表中雇员的职位并返回该雇员的记录。 TVF_EMPLOYEE函数和 Employee 表是通过运行示例提供的 SQL 脚本创建的。 有关详细信息,请参阅 适配器示例

关于本主题中使用的示例

本主题中的示例调用 Employee 表上的TVF_EMPLOYEE表值函数。 TVF_EMPLOYEE函数和 Employee 表是通过运行示例提供的 SQL 脚本创建的。 SQL 适配器示例还提供了一个名为 TableFunction_ServiceModel 的示例,它基于本主题。 有关详细信息,请参阅 适配器示例

WCF 客户端类

下表中列出了使用 SQL 适配器调用 SQL Server 中标量函数而生成的 WCF 客户端的名称。

SQL Server 数据库工件 WCF 客户端名称
表值函数 表值函数_[SCHEMA]客户端

[SCHEMA] = SQL Server 对象的集合; 例如 dbo。

调用表值函数的方法签名

下表显示了表的基本操作方法签名。 视图的签名与表相同,唯视图的命名空间和名称替换了表的命名空间和名称。

操作 方法签名
表值函数名称 public [NAMESPACE][FUNCTION_NAME][] [FUNCTION_NAME](param1, param2, ...)

[NAMESPACE] = 命名空间,例如,schemas.microsoft.com.Sql._2008._05.Types.TableFunctionReturnTables.dbo.TVF_EMPLOYEE

[FUNCTION_NAME] = 表值函数的名称。

例如,下面的代码演示 dbo 架构中为 TVF_EMPLOYEE 标量函数生成的 WCF 客户端类的方法签名,该函数采用员工指定为参数并返回员工记录。

public partial class TableValuedFunctions_dboClient : System.ServiceModel.ClientBase<TableValuedFunctions_dbo>, TableValuedFunctions_dbo {      
    public schemas.microsoft.com.Sql._2008._05.Types.TableFunctionReturnTables.dbo.TVF_EMPLOYEE[] TVF_EMPLOYEE(string emp_desig);  
}  

在此代码片段中, TableValuedFunctions_dboClient 是由“添加适配器服务引用插件”生成的SqlAdapterBindingClient.cs WCF 类的名称。

调用表值函数的参数

用于调用表值函数的 SQL 适配器公开的方法的参数与 SQL Server 中的函数定义中定义的参数相同。 例如,调用TVF_EMPLOYEE表值函数的参数是emp_desig,用于传递员工的职称。

同样,表值函数的返回值与 SQL Server 中的函数定义中定义的返回值相同。 例如,TVF_EMPLOYEE 函数的返回值是 schemas.microsoft.com.Sql._2008._05.Types.TableFunctionReturnTables.dbo.TVF_EMPLOYEE[] 类型的记录数组。

创建 WCF 客户端以调用表值函数

使用 WCF 客户端在 SQL Server 上执行作所需的泛型作集涉及使用 SQL 适配器的 WCF 服务模型概述中所述的一组任务。 本部分介绍如何创建 WCF 客户端以调用 TVF_EMPLOYEE 表值函数。

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

  2. TVF_EMPLOYEE 标量函数生成 WCF 客户端类。 有关生成 WCF 客户端类的详细信息,请参阅 为 SQL Server 项目生成 WCF 客户端或 WCF 服务协定

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

  4. 打开Program.cs并创建客户端,如以下代码片段中所述。

    
              TableValuedFunctions_dboClient client = new TableValuedFunctions_dboClient("SqlAdapterBinding_TableValuedFunctions_dbo");  
    client.ClientCredentials.UserName.UserName = "<Enter user name here>";  
    client.ClientCredentials.UserName.Password = "<Enter password here>";  
    

    在此代码片段中, TableValuedFunctions_dboClient 是SqlAdapterBindingClient.cs中定义的 WCF 客户端。 此文件由“添加适配器服务引用插件”生成。 SqlAdapterBinding_TableValuedFunctions_dbo 是客户端终结点配置的名称,并在 app.config中定义。此文件也由添加适配器服务引用插件生成,并包含绑定属性和其他配置设置。

    注释

    在此代码片段中,将使用配置文件中的绑定和终结点地址。 还可以在代码中显式指定这些值。 有关指定客户端绑定的不同方式的详细信息,请参阅 为 SQL 适配器配置客户端绑定

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

    try  
    {  
       Console.WriteLine("Opening Client...");  
       client.Open();  
    }  
    catch (Exception ex)  
    {  
       Console.WriteLine("Exception: " + ex.Message);  
       throw;  
    }  
    
  6. 调用 TVF_EMPLOYEE 函数以检索具有“经理”指定的所有员工记录。

    Console.WriteLine("Invoking the TVF_EMPLOYEE function");  
    schemas.microsoft.com.Sql._2008._05.Types.TableFunctionReturnTables.dbo.TVF_EMPLOYEE[] emp_details;  
    string emp_designation = "Manager";  
    
    try  
    {  
        emp_details = client.TVF_EMPLOYEE(emp_designation);  
    }  
    catch (Exception e)  
    {  
        Console.WriteLine("Exception: " + e.Message);  
        throw;  
    }  
    Console.WriteLine("The details for the employee with the 'Manager' designation are:");  
    Console.WriteLine("*******************************************************************");  
    for (int i = 0; i < emp_details.Length; i++)  
    {  
        Console.WriteLine("Employee ID        : " + emp_details[i].Employee_ID);  
        Console.WriteLine("Employee Name      : " + emp_details[i].Name);  
        Console.WriteLine("Employee Desigation: " + emp_details[i].Designation);  
        Console.WriteLine("Employee Salary    : " + emp_details[i].Salary);  
        Console.WriteLine();  
    }  
    
  7. 按以下代码片段中所述关闭客户端:

    client.Close();  
    Console.WriteLine("Press any key to exit...");  
    Console.ReadLine();  
    
  8. 生成项目,然后运行它。 该应用程序显示具有“经理”指定的所有员工的员工 ID、名称和工资。

另请参阅

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