使用 WCF 服务模型在 SQL 中执行 ExecuteReader、ExecuteScalar 或 ExecuteNonQuery 操作
SQL 适配器公开一般SQL Server操作,例如 ExecuteNonQuery、ExecuteReader 和 ExecuteScalar。 可以使用这些操作对SQL Server数据库执行任何 SQL 语句。 这些操作因针对 SQL 语句获取的响应类型而异。 有关适配器如何支持这些操作的详细信息,请参阅 对 ExecuteNonQuery、ExecuteReader 和 ExecuteScalar 操作的支持。
本主题演示如何使用 WCF 服务模型通过 SQL 适配器执行 ExecuteReader 操作。 可以按照本主题中所述的同一组过程来执行 ExecuteNonQuery 和 ExecuteScalar 操作。
关于本主题中使用的示例
本主题中的示例使用 ExecuteReader 操作来执行ADD_EMP_DETAILS存储过程。 此存储过程向 Employee 表添加一条记录,并返回该记录的员工 ID。 ADD_EMP_DETAILS存储过程是通过运行随示例一起提供的 SQL 脚本创建的。 有关示例的详细信息,请参阅 适配器示例。 SQL 适配器示例也提供了基于本主题 的示例 Execute_Reader。
WCF 客户端类
下表列出了为使用 SQL 适配器 (ExecuteNonQuery、ExecuteReader 或 ExecuteScalar) 调用泛型操作而生成的 WCF 客户端的名称。
Operations | WCF 客户端名称 |
---|---|
ExecuteNonQuery、ExecuteReader 或 ExecuteScalar | GenericTableOpClient |
用于调用泛型操作的方法签名
下表显示了公开用于调用泛型操作的方法的签名。
操作 | 方法签名 |
---|---|
ExecuteNonQuery | int ExecuteNonQuery (字符串查询) |
ExecuteReader | System.Data.DataSet[] ExecuteReader (字符串查询) |
ExecuteScalar | string ExecuteScalar (string Query) |
例如,泛型操作方法的签名显示在以下代码片段中。
public partial class GenericTableOpClient : System.ServiceModel.ClientBase<GenericTableOp>, GenericTableOp {
public int ExecuteNonQuery(string Query);
public System.Data.DataSet[] ExecuteReader(string Query);
public string ExecuteScalar(string Query);
}
在此代码片段中,
GenericTableOpClient
是类的名称。 在此示例中,使用此类创建一个客户端来调用泛型操作 ExecuteReader。public System.Data.DataSet[] ExecuteReader(string Query)
是在此示例中调用的方法,用于调用ADD_EMP_DETAILS存储过程。
创建 WCF 客户端以调用 ExecuteReader 操作
使用 WCF 客户端对 SQL Server 执行操作所需的通用操作集涉及使用 SQL 适配器的 WCF 通道模型概述中所述的一组任务。 本部分专门介绍如何创建调用 ExecuteReader 操作以执行ADD_EMP_DETAILS存储过程的 WCF 客户端。 此存储过程是通过运行每个示例随附的 SQL 脚本创建的。
创建 WCF 客户端以调用 ExecuteReader 操作
在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。
为 ExecuteReader 泛型操作生成 WCF 客户端类。 使用“添加适配器服务引用插件”连接到 SQL Server 数据库时,可在根节点下执行此操作。 有关生成 WCF 客户端类的详细信息,请参阅为SQL Server项目生成 WCF 客户端或 WCF 服务协定。
重要
在生成 WCF 客户端类之前,请确保将 EnableBizTalkCompatibilityMode 绑定属性设置为 false。
在解决方案资源管理器,添加对 和
Microsoft.ServiceModel.Channels
的Microsoft.Adapters.Sql
引用。打开 Program.cs 文件并创建客户端,如以下代码片段中所述。
GenericTableOpClient client = new GenericTableOpClient("SqlAdapterBinding_GenericTableOp"); client.ClientCredentials.UserName.UserName = "<Enter username here>"; client.ClientCredentials.UserName.Password = "<Enter password here>";
在此代码片段中,
GenericTableOpClient
是在 SqlAdapterBindingClient.cs 中定义的 WCF 客户端。 此文件由添加适配器服务引用插件生成。SqlAdapterBinding_GenericTableOp
是客户端终结点配置的名称,在 app.config 中定义。此文件也由添加适配器服务引用插件生成,并包含绑定属性和其他配置设置。注意
在此代码片段中,使用配置文件中的绑定和终结点地址。 还可以在代码中显式指定这些值。 有关指定客户端绑定的不同方法的详细信息,请参阅 为 SQL 适配器配置客户端绑定。
打开客户端,如以下代码片段中所述:
try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
调用ADD_EMP_DETAILS存储过程的 ExecuteReader 操作。 在调用 ExecuteReader 操作之前,必须将 命名空间添加到
System.Data
代码中。string query = "EXEC ADD_EMP_DETAILS 'Tom Smith', 'Manager', 500000"; DataSet[] dsArray = client.ExecuteReader(query); Console.WriteLine("Invoking the ADD_EMP_DETAILS stored procedure using ExecuteReader"); Console.WriteLine("*****************************************************"); foreach (DataSet dataSet in dsArray) { foreach (DataTable tab in dsArray[0].Tables) { foreach (DataRow row in tab.Rows) { for (int i = 0; i < tab.Columns.Count; i++) { Console.WriteLine("The ID for the newly added employee is : " + row[i]); } } } } Console.WriteLine("*****************************************************");
关闭客户端,如以下代码片段中所述:
client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
生成项目,然后运行它。 新插入的员工的员工 ID 显示在主机上。