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

用于存储的 Microsoft BizTalk 适配器SQL Server数据库表和视图上发现一组基本的插入、选择、SQL Server和删除操作。 通过使用这些操作,可以执行简单的插入SQL、选择、更新和删除语句,这些语句由目标表或视图中的 Where 子句限定。 本主题说明如何使用 WCF 服务模型执行这些操作。

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

注意

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

关于本主题中使用的示例

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

WCF 客户端类

为 SQL 适配器发现的基本 SQL 操作生成的 WCF 客户端的名称基于下表中列出的表或视图的名称。

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

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

[TABLE_NAME] = 表的名称;例如 Employee。

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

用于调用对表的操作的方法签名

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

操作 方法签名
插入 long[] 插入 ([TABLE_NS]。[TABLE_NAME][] 行) ;
Select [TABLE_NS]。[TABLE_NAME][] 选择 (列,字符串 QUERY) ;
更新 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] = 表的名称;例如 Employee。

例如,以下代码显示了针对默认"dbo"架构下的 Employee 表的 Delete、Insert、Select 和 Update 操作生成的 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

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

重要

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

删除操作

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

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

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

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

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

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

    重要

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

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

  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 操作。 "选择"操作选择插入到表中的最后一条记录。 返回的记录将写入控制台。

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 表为目标的更新操作。

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 表为目标的删除操作。

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 服务模型开发应用程序