使用 WCF 服务模型在 SQL 中执行 ExecuteReader、ExecuteScalar 或 ExecuteNonQuery 操作

SQL 适配器公开一般SQL Server操作,例如 ExecuteNonQueryExecuteReaderExecuteScalar。 可以使用这些操作对SQL Server数据库执行任何 SQL 语句。 这些操作因针对 SQL 语句获取的响应类型而异。 有关适配器如何支持这些操作的详细信息,请参阅 对 ExecuteNonQuery、ExecuteReader 和 ExecuteScalar 操作的支持

本主题演示如何使用 WCF 服务模型通过 SQL 适配器执行 ExecuteReader 操作。 可以按照本主题中所述的同一组过程来执行 ExecuteNonQueryExecuteScalar 操作。

关于本主题中使用的示例

本主题中的示例使用 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 操作

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

  2. ExecuteReader 泛型操作生成 WCF 客户端类。 使用“添加适配器服务引用插件”连接到 SQL Server 数据库时,可在根节点下执行此操作。 有关生成 WCF 客户端类的详细信息,请参阅为SQL Server项目生成 WCF 客户端或 WCF 服务协定

    重要

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

  3. 在解决方案资源管理器,添加对 和 Microsoft.ServiceModel.ChannelsMicrosoft.Adapters.Sql引用。

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

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

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

    client.Close();  
    Console.WriteLine("Press any key to exit...");  
    Console.ReadLine();  
    
  8. 生成项目,然后运行它。 新插入的员工的员工 ID 显示在主机上。