使用 WCF 服务模型在 SQL Server 中调用标量函数

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

本主题如何演示如何使用 WCF 服务模型调用标量函数

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

关于本主题中使用的示例

本主题中的示例调用 Employee 表上的GET_EMP_ID标量函数。 GET_EMP_ID函数和 Employee 表是通过运行示例提供的 SQL 脚本创建的。 基于本主题的示例 ScalarFunction_ServiceModel 也作为 SQL 适配器示例的一部分提供。 有关详细信息,请参阅 适配器示例

WCF 客户端类

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

SQL Server 数据库工件 WCF 客户端名称
标量函数 ScalarFunctions_[SCHEMA]Client

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

调用标量函数的方法签名

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

操作 方法签名
标量函数名称 public <return_type><scalar_function_name>(param1, param2, ...)

< > retrun_type= 函数定义中定义的返回类型

< > scalar_function_name= 标量函数的名称。

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

public partial class ScalarFunctions_dboClient : System.ServiceModel.ClientBase<ScalarFunctions_dbo>, ScalarFunctions_dbo {      
    public System.Nullable<int> GET_EMP_ID(string emp_desig);  
}  

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

调用标量函数的参数

用于调用标量函数的 SQL 适配器公开的方法的参数与 SQL Server 中标量函数定义中定义的参数相同。 例如,用于调用GET_EMP_ID标量函数的参数是emp_desig,它接受员工的职位。

同样,标量函数的返回值与 SQL Server 中标量函数定义中定义的返回值相同。 例如,GET_EMP_ID 函数的返回值是员工类型为整数的 ID。

创建 WCF 客户端以调用标量函数

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

创建 WCF 客户端

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

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

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

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

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

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

    注释

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

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

    try  
    {  
       Console.WriteLine("Opening Client...");  
       client.Open();  
    }  
    catch (Exception ex)  
    {  
       Console.WriteLine("Exception: " + ex.Message);  
       throw;  
    }  
    
  6. 调用 GET_EMP_ID 函数,以检索指定为“Manager”的员工的 ID。

    Console.WriteLine("Invoking the GET_EMP_ID function");  
    string emp_designation = "Manager";  
    try  
    {  
          System.Nullable<int> emp_id = client.GET_EMP_ID(emp_designation);  
          Console.WriteLine("The Employee ID for the employee with 'Manager' designation is:" + emp_id);  
    }  
    catch (Exception e)  
    {  
          Console.WriteLine("Exception: " + e.Message);  
          throw;  
    }  
    

    注释

    为简单起见, Employee 表只有一位具有“经理”称号的员工。 如果目标表中有更多具有相同职位的员工,则必须相应地定义该函数。

  7. 按以下代码片段中所述关闭客户端:

    client.Close();  
    Console.WriteLine("Press any key to exit...");  
    Console.ReadLine();  
    
  8. 生成项目,然后运行它。 应用程序显示职称为“经理”的员工的员工编号。

另请参阅

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