使用 WCF 服务模型在 SQL 中插入、更新、删除或选择操作

Microsoft BizTalk Adapter for SQL Server发现一组对SQL Server数据库表和视图的基本插入、选择、更新和删除操作。 通过使用这些操作,可以对目标表或视图执行由 Where 子句限定的简单 SQL Insert、Select、Update 和 Delete 语句。 本主题提供有关如何使用 WCF 服务模型执行这些操作的说明。

有关适配器如何支持这些操作的详细信息,请参阅 使用 SQL 适配器对表和视图执行插入、更新、删除和选择操作

注意

如果要对具有用户定义类型的列的表执行操作,请确保在开始开发应用程序之前,使用 SQL 适配器引用对具有 User-Defined 类型的表和视图的操作

关于本主题中使用的示例

本主题中的示例对 Employee 表执行操作。 Employee 表是通过运行示例随附的 SQL 脚本创建的。 有关示例的详细信息,请参阅 适配器示例。 基于本主题的示例 EmployeeBasicOps 也随 SQL 适配器示例一起提供。

WCF 客户端类

为 SQL 适配器发现的基本 SQL 操作生成的 WCF 客户端的名称基于表或视图的名称,如下表所示。

SQL Server数据库项目 WCF 客户端名称
TableOp_[Schema]_[TABLE_NAME]Client
视图 ViewOp_[架构]_[VIEW_NAME]客户端

[SCHEMA] = SQL Server项目的集合;例如,dbo。

[TABLE_NAME] = 表的名称;例如,员工。

[VIEW_NAME] = 视图的名称;例如,Employee_View。

对表调用操作的方法签名

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

操作 方法签名
插入 long[] 插入 ([TABLE_NS]。[TABLE_NAME][] 行) ;
Select [TABLE_NS]。[TABLE_NAME][] 选择 (字符串列、字符串查询) ;
更新 int Update ([TABLE_NS]。[TABLE_NAME]。RowPair[] 行) ;
删除 int Delete ([TABLE_NS]。[TABLE_NAME][] 行) ;

[TABLE_NS] = 表命名空间的名称;例如,schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee。

[TABLE_NAME] = 表的名称;例如,员工。

例如,以下代码显示了为默认“dbo”架构下的 Employee 表上的删除、插入、选择和更新操作生成的 WCF 客户端类的方法签名。

public partial class TableOp_dbo_EmployeeClient : System.ServiceModel.ClientBase<TableOp_dbo_Employee>, TableOp_dbo_Employee {      
    public int Delete(schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Rows);  
  
    public long[] Insert(schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Rows);  
  
    public schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] Select(string Columns, string Query);  
  
    public int Update(schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[] Rows);  
}  

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

表操作的参数

本部分提供每个表操作所需的参数

插入操作

插入操作类型 记录
多条记录 应插入表中的 INSERTRECORDS 的集合。

插入操作返回 Long 数据类型的数组,并存储插入行的标识值(如果有)。 如果表中没有标识列,则返回值为 NULL。

选择操作

COLUMN_NAMES QUERY
目标中以逗号分隔的列名列表;例如,“Employee_ID,指定”。 列列表指定应在结果集中返回的目标列。 未在列列表中指定的列将在返回的记录集中设置为其 .NET 默认值。 对于 nillable 列,此值为 null 指定查询的目标行的 SQL WHERE 子句的内容;例如,“指定 = 'Manager'”。 可以将此参数设置为 null 以返回目标的所有行。

Select 操作的返回值是强类型结果集,其中包含目标表或视图中的指定列和行。

更新操作

对的第一行 对的第二行
记录对的第一条记录对应于需要更新的新值,也就是说,它对应于 UPDATE 语句的 SET 子句。 这可以使用 进行设置 RowPair.After 记录对的第二条记录对应于行的旧值,也就是说,它对应于 UPDATE 语句的 WHERE 子句。 这可以使用 进行设置 RowPair.Before

Update 操作的返回值为 Int32 数据类型,表示更新的行数。

重要

指定必须更新的记录时,必须为所有列提供值,即使未更新所有值。 例如,如果一行有五列,而更新操作仅更新 2 列,作为 RowPair.Before 的一部分,则必须传递所有 5 列值。 但是,对于 RowPair.After,只能指定将更新的列。

删除操作

Delete 操作采用强类型记录数组作为输入。 Delete 操作的返回值为 Int32 数据类型,表示已删除的行数。

创建 WCF 客户端以调用对表和视图的操作

使用 WCF 客户端对 SQL Server 执行操作所需的通用操作集涉及使用 SQL 适配器的 WCF 服务模型概述中所述的一组任务。 本部分介绍如何创建 WCF 客户端以调用对表的基本插入、选择、更新、删除操作。

创建 WCF 客户端以对表执行操作

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

  2. 为 Employee 表上的 Insert、Select、Update 和 Delete 操作生成 WCF 客户端类。 有关生成 WCF 客户端类的详细信息,请参阅为SQL Server项目生成 WCF 客户端或 WCF 服务协定

    重要

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

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

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

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

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

    注意

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

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

    try  
    {  
       Console.WriteLine("Opening Client...");  
       client.Open();  
    }  
    catch (Exception ex)  
    {  
       Console.WriteLine("Exception: " + ex.Message);  
       throw;  
    }  
    
  6. 对 Employee 表调用 Insert 操作。

    long[] recordsInserted;  
    
    schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] insertRecord =  
    new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[1];  
    
    insertRecord[0] = new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee();  
    insertRecord[0].Name = "John Smith";  
    insertRecord[0].Designation = "Manager";  
    insertRecord[0].Salary = 500000;  
    
    try  
    {  
       Console.WriteLine("Inserting new table entry...");  
       recordsInserted = client.Insert(insertRecord);  
    }  
    catch (Exception ex)  
    {  
       Console.WriteLine("Exception: " + ex.Message);  
       throw;  
    }  
    
    Console.WriteLine("Record inserted");  
    Console.WriteLine("Press any key to continue ...");  
    Console.ReadLine();  
    

    也可以替换前面的代码片段来执行选择、更新或删除操作。 还可以追加代码片段,以在单个应用程序中执行所有操作。 有关如何执行这些操作的代码片段。

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

    client.Close();  
    Console.WriteLine("Press any key to exit...");  
    Console.ReadLine();  
    
  8. 生成项目,然后运行它。 应用程序在 Employee 表中插入记录。

选择操作

以下代码显示了面向 Employee 表的 Select 操作。 Select 操作选择插入表中的最后一条记录。 返回的记录将写入控制台。

schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] selectRecords;  
  
try  
{  
   Console.WriteLine("Selecting Row...");  
   selectRecords = client.Select("*", "where [Employee_ID] = (select IDENT_CURRENT('Employee'))");  
}  
  
catch (Exception ex)  
{  
   Console.WriteLine("Exception: " + ex.Message);  
   throw;  
}  
  
Console.WriteLine("The details of the newly added employee are:");  
Console.WriteLine("********************************************");  
for (int i = 0; i < selectRecords.Length; i++)  
{  
   Console.WriteLine("Employee ID        : " + selectRecords[i].Employee_ID);  
   Console.WriteLine("Employee Name      : " + selectRecords[i].Name);  
   Console.WriteLine("Employee Desigation: " + selectRecords[i].Designation);  
   Console.WriteLine();  
}  
Console.WriteLine("********************************************");  
Console.WriteLine("Press any key to continue ...");  
Console.ReadLine();  

更新操作

以下代码显示了面向 Employee 表的 Update 操作。

int result;  
  
schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair updateRecordPair =  
   new schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair();  
  
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee updateRecord =   
   new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee();  
  
schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[] updateArray =  
   new schemas.microsoft.com.Sql._2008._05.TableOp.dbo.Employee.RowPair[1];  
  
updateRecord = insertRecord[0];  
updateRecord.Name = "Jeff Smith";  
  
updateRecordPair.After = updateRecord;  
updateRecordPair.Before = selectRecords[0];  
  
updateArray[0] = updateRecordPair;  
  
try  
{  
   Console.WriteLine("Updating the database...");  
   result = client.Update(updateArray);  
}  
catch (Exception ex)  
{  
   Console.WriteLine("Exception: " + ex.Message);  
   throw;  
}  
  
Console.WriteLine("Updated Record for {0}", updateRecordPair.Before.Name);  
Console.WriteLine("The new name for the employee is {0}", updateRecordPair.After.Name);  
Console.WriteLine("Press any key to continue ...");  
Console.ReadLine();  

删除操作

以下代码演示了面向 Employee 表的 Delete 操作。

int deleteSuccess;  
  
schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[] deleteRecords =  
   new schemas.microsoft.com.Sql._2008._05.Types.Tables.dbo.Employee[1];  
  
deleteRecords = client.Select("*", "where [Employee_ID] = (select IDENT_CURRENT('Employee'))");  
  
Console.WriteLine("Following employees will be deleted from the database:");  
for (int i = 0; i < deleteRecords.Length; i++)  
{  
   Console.WriteLine("Name: {0}", deleteRecords[i].Name);  
}  
Console.WriteLine("Press any key to begin deletion...");  
Console.ReadLine();  
  
try  
{  
   Console.WriteLine("Deleting employee record...");  
   deleteSuccess = client.Delete(deleteRecords);  
}  
  
catch (Exception ex)  
{  
   Console.WriteLine("Exception: " + ex.Message);  
   throw;  
}  

另请参阅

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