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 客户端以对表执行操作
- 在 Visual Studio 中创建 Visual C# 项目。 对于本主题,请创建控制台应用程序。 
- 为 Employee 表上的 Insert、Select、Update 和 Delete 操作生成 WCF 客户端类。 有关生成 WCF 客户端类的详细信息,请参阅为SQL Server项目生成 WCF 客户端或 WCF 服务协定。 - 重要 - 在生成 WCF 客户端类之前,请确保将 EnableBizTalkCompatibilityMode 绑定属性设置为 false。 
- 在解决方案资源管理器,添加对 和 - Microsoft.ServiceModel.Channels的- Microsoft.Adapters.Sql引用。
- 打开 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 适配器配置客户端绑定。 
- 打开客户端,如以下代码片段中所述: - try { Console.WriteLine("Opening Client..."); client.Open(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); throw; }
- 对 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();- 也可以替换前面的代码片段来执行选择、更新或删除操作。 还可以追加代码片段,以在单个应用程序中执行所有操作。 有关如何执行这些操作的代码片段。 
- 如以下代码片段中所述关闭客户端: - client.Close(); Console.WriteLine("Press any key to exit..."); Console.ReadLine();
- 生成项目,然后运行它。 应用程序在 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;  
}