使用 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 客户端名称 |
---|---|
Table-valued 函数 | TableValuedFunctions_[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 表值函数。
在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。
为 TVF_EMPLOYEE 标量函数生成 WCF 客户端类。 有关生成 WCF 客户端类的详细信息,请参阅为SQL Server项目生成 WCF 客户端或 WCF 服务协定。
在解决方案资源管理器,添加对 和
Microsoft.ServiceModel.Channels
的Microsoft.Adapters.Sql
引用。打开 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 适配器配置客户端绑定。
打开客户端,如以下代码片段中所述:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
调用 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(); }
关闭客户端,如以下代码片段中所述:
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
生成项目,然后运行它。 应用程序显示具有“经理”称号的所有员工的员工 ID、姓名和工资。