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

适用于 Oracle 数据库的 Microsoft BizTalk 适配器针对 Oracle 数据库表和视图显示一组基本的插入、更新、删除和选择操作。 通过使用这些操作,可以对目标表或视图执行由 WHERE 子句限定的简单 SQL INSERT、UPDATE、SELECT 和 DELETE 语句。 若要执行更复杂的操作,例如使用 JOIN 运算符的 SQL SELECT 查询,可以使用 SQLEXECUTE 操作。 有关 SQLEXECUTE 操作的详细信息,请参阅 使用 WCF 服务模型在 Oracle 数据库中执行 SQLEXECUTE 操作

下表总结了 Oracle 数据库适配器在表和视图中显示的基本 SQL 操作。 有关这些操作的完整说明,请参阅 针对表和视图的基本插入、更新、删除和选择操作的消息架构

操作 说明
插入 插入操作支持将多个记录或批量插入到目标表或视图中:

- 多记录插入操作基于提供的记录集将行插入到表或视图中。
- 批量插入操作基于提供的 SQL SELECT 查询和列列表将行插入表或视图中。 查询返回的记录将基于列列表插入到目标表中。
Select 基于提供的列名列表和指定 SQL WHERE 子句的筛选器字符串对目标表执行 SQL SELECT 查询。
更新 对目标表执行 UPDATE。 要更新的记录由指定 SQL WHERE 子句的筛选器字符串指定。 更新的值在模板记录中指定。
删除 基于筛选器字符串中指定的 SQL WHERE 子句对目标表执行 DELETE。

关于本主题中使用的示例

本主题中的示例使用 /SCOTT/ACCOUNTACTIVITY 表。 SDK 示例提供了生成此表的脚本。 有关 SDK 示例的详细信息,请参阅 SDK 中的示例

WCF 客户端类

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

Oracle 数据库项目 WCF 客户端名称
[SCHEMA]Table[TABLE_NAME]Client
视图 [SCHEMA]View[VIEW_NAME]客户端

[SCHEMA] = Oracle 项目的集合;例如 SCOTT。

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

[VIEW_NAME] = 视图的名称。

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

操作 方法签名
插入 long Insert ([TABLE_NS]。[TABLE_NAME]RECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY) ;
Select [TABLE_NS]。[TABLE_NAME]RECORDSELECT[] 选择 (字符串COLUMN_NAMES,字符串筛选器) ;
更新 long Update ([TABLE_NS]。[TABLE_NAME]RECORDUPDATE RECORDSET, string FILTER) ;
删除 长删除 (字符串 FILTER) ;

[TABLE_NS] = 表命名空间的名称;例如,microsoft.lobservices.oracledb._2007._03.SCOTT。Table.ACCOUNTACTIVITY。

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

Insert、Update 和 Select 操作使用的记录类型都在表或视图命名空间中定义。

以下代码显示了为 /SCOTT/ACCOUNTACTIVITY 表上的 Delete、Insert、Select 和 Update 操作生成的 WCF 客户端类的方法签名。

public partial class SCOTTTableACCOUNTACTIVITYClient : System.ServiceModel.ClientBase<SCOTTTableACCOUNTACTIVITY>, SCOTTTableACCOUNTACTIVITY {  
  
    public long Delete(string FILTER);  
  
    public long Insert(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY);  
  
    public microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] Select(string COLUMN_NAMES, string FILTER);  
  
    public long Update(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE RECORDSET, string FILTER);  
}  

调用基本 SQL 操作

若要使用 WCF 客户端对表或视图调用基本 SQL 操作,请执行以下步骤。

  1. 为目标表或视图生成 WCF 客户端类。 此类应包含要对目标项目调用的操作的方法。

  2. 创建 WCF 客户端类的实例并调用其方法来对表或视图执行操作。

    有关如何在 Oracle 数据库适配器上创建 WCF 客户端类和调用操作的更多详细信息,请参阅 使用 Oracle 数据库适配器的 WCF 服务模型概述

    Oracle 数据库适配器在 Oracle 数据库上的事务内执行每个操作。 可以通过设置 TransactionIsolationLevel 绑定属性来控制此事务的隔离级别。 有关 Oracle 数据库适配器绑定属性的详细信息,请参阅 使用适用于 Oracle 数据库绑定属性的 BizTalk 适配器

    以下部分提供有关如何在代码中调用每个基本 SQL 操作的详细信息。

插入操作

下表显示了如何为多记录插入和批量插入操作设置参数。

插入操作类型 记录 COLUMN_NAMES QUERY
多条记录 应插入目标中的 INSERTRECORDS 的集合。 Null Null
批量 Null 目标中以逗号分隔的列名列表;例如,“TID, ACCOUNT”。 列列表指定每个插入行中应放置查询结果的列。 查询必须返回一个结果集,该结果集与列列表中指定的列同时包含数字和类型。 对数据库表或视图的 SQL SELECT 查询,该查询返回要插入目标的结果集;例如,“SELECT (TID, ACCOUNT) FROM NEW_TRANSACTIONS WHERE ACCOUNT = 100001”。 结果集必须与数字和类型中的列列表匹配。

Insert 操作返回插入到目标中的记录数。

重要

在 WCF 服务模型中,插入操作中使用的记录集是强类型。 可以在记录中将 nillable 列的值设置为 null ,以便从插入操作中排除该列;但是,不能将不可为 null 列的值设置为 null。 这意味着,在多记录插入操作中,必须为每条记录中的所有不可删除列提供值。 此外,使用 WCF 服务模型时,基本 SQL 操作没有流式处理支持。 如果多条记录插入操作涉及大型记录集,这可能是一个重要考虑因素。 有关详细信息,请参阅 使用 WCF 服务模型调用基本 SQL 操作的限制

下面的代码显示了一个多记录插入操作, (两个记录) ,该记录面向 ACCOUNTACTIVITY 表。

// Insert records  
                using (SCOTTTableACCOUNTACTIVITYClient aaTableClient =   
                    new SCOTTTableACCOUNTACTIVITYClient("OracleDBBinding_SCOTT.Table.ACCOUNTACTIVITY"))  
                {  
                    long recsInserted;  
  
                    aaTableClient.ClientCredentials.UserName.UserName = "SCOTT";  
                    aaTableClient.ClientCredentials.UserName.Password = "TIGER";  
  
                    try  
                    {  
                        aaTableClient.Open();  
                    }  
                    catch (Exception ex)  
                    {  
                        // handle exception  
                        Console.WriteLine("Exception: " + ex.Message);  
                        throw;  
                    }  
  
                    // Do a multiple record Insert of 2 records for account 100001  
  
                    microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] insertRecs =  
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[2];  
  
                                  TID__COMPLEX_TYPE tid = new TID__COMPLEX_TYPE();  
                                  tid.InlineValue = "tidSequence.NextVal()";  
  
                                  ACCOUNT__COMPLEX_TYPE account = new ACCOUNT__COMPLEX_TYPE();  
                                  account.Value = 100001;  
  
                    AMOUNT__COMPLEX_TYPE amount = new AMOUNT__COMPLEX_TYPE();  
                    amount.Value = 400;  
  
                    TRANSDATE__COMPLEX_TYPE transdate = new TRANSDATE__COMPLEX_TYPE();  
                    transdate.Value = DateTime.Now.Date;  
  
                    PROCESSED__COMPLEX_TYPE processed = new PROCESSED__COMPLEX_TYPE();  
                    processed.Value = "n";  
  
                    DESCRIPTION__COMPLEX_TYPE description1 = new DESCRIPTION__COMPLEX_TYPE();  
                    description1.Value = "Inserted Record #1";  
  
                    DESCRIPTION__COMPLEX_TYPE description2 = new DESCRIPTION__COMPLEX_TYPE();  
                    description2.Value = "Inserted Record #2";  
  
                    insertRecs[0] =   
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();  
                    insertRecs[0].TID = tid;  
                    insertRecs[0].ACCOUNT = account;  
                    insertRecs[0].AMOUNT = amount;  
                    insertRecs[0].TRANSDATE = transdate;  
                    insertRecs[0].DESCRIPTION = description1;  
                    insertRecs[0].PROCESSED = processed;  
  
                    insertRecs[1] =   
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();  
                    insertRecs[1].TID = tid;  
                    insertRecs[1].ACCOUNT = account;  
                    insertRecs[1].AMOUNT = amount;  
                    insertRecs[1].TRANSDATE = transdate;  
                    insertRecs[1].DESCRIPTION = description2;  
                    insertRecs[1].PROCESSED = processed;  
  
                    try  
                    {  
                        recsInserted = aaTableClient.Insert(insertRecs, null, null);  
                    }  
                    catch (Exception ex)  
                    {  
                        // handle exception  
                        Console.WriteLine("Exception: " + ex.Message);  
                        throw;  
                    }  
  
                    Console.WriteLine("Insert Done: {0} records inserted", recsInserted);  

选择操作

下表显示了 Select 操作的参数。

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

Select 操作根据目标的行类型返回强类型记录集。

重要

使用 WCF 服务模型时,没有对基本 SQL 操作的流式处理支持。 如果查询返回大型记录集,则可以使用 WCF 通道模型提高性能。 有关详细信息,请参阅 使用 WCF 服务模型调用基本 SQL 操作的限制

以下代码显示了面向 ACCOUNTACTIVITY 表的 Select 操作。 返回的记录将写入控制台。

// Declare a variable to hold the result set  
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] selectRecords;  
  
// Select all records and write them to the console  
try  
{  
    selectRecords = aaTableClient.Select("*", null);  
}  
catch (Exception ex)  
{  
    // handle exception  
}  
  
Console.WriteLine("ACCOUNTACTIVITY before any operations");  
for (int i = 0; i \< selectRecords.Length; i++)  
{  
    Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", selectRecords[i].TID,  
    selectRecords[i].ACCOUNT,  
    selectRecords[i].AMOUNT,  
    selectRecords[i].TRANSDATE,  
    selectRecords[i].DESCRIPTION);  
}  

注意

此代码省略了创建、配置和打开 WCF 客户端实例的步骤。 有关包含这些步骤的示例,请参阅 插入操作

更新操作

下表显示了 Update 操作的参数。

记录 FILTER
基于目标的行类型的强类型模板记录。 模板记录指定目标行的更新值。 对于 nillable 行列,可以指定一个 null 值来指示不应在目标行中更新该列。 SQL WHERE 子句的内容,该子句指定要在目标中更新的行。 例如,“DESCRIPTION= 'Inserted Record #1'”。

Update 操作返回从目标中删除的行数。

重要

在 WCF 服务模型中,更新操作中使用的模板记录为强类型。 如果列为 nillable,则可以通过在模板记录中将其值设置为 null ,从更新操作中省略该列;但是,如果列不可为 null,则必须在模板记录中设置其值。 例如,如果列是主键,则它必须包含一个值。 有关详细信息,请参阅 使用 WCF 服务模型调用基本 SQL 操作的限制

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

long recsUpdated;  
  
...  
  
// Create updated template. The TID, TIME, AMOUNT, and DESCRIPTION fields will be updated  
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE updateRecord =  
    new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE();  
        updateRecord.TID = tidSequence.NextVal();  
        updateRecord.ACCOUNT = null;  
        updateRecord.AMOUNT = 300;  
        updateRecord.TRANSDATE = DateTime.Now.Date;  
        updateRecord.DESCRIPTION = "Updated Record #2";  
        updateRecord.PROCESSED = null;  
  
// Set filter string to specify the target record by using the DESCRIPTION field  
string filter = "DESCRIPTION = 'Inserted Record #2'";  
  
try  
{  
    recsUpdated = aaTableClient.Update(updateRecord, filter);  
}  
catch (Exception ex)  
{  
    // handle exception  
    ...  
}  
  
Console.WriteLine("{0} records updated", recsUpdated);  

注意

此代码省略了创建、配置和打开 WCF 客户端实例的步骤。 有关包含这些步骤的示例,请参阅 插入操作

删除操作

下表显示了 Delete 操作的参数。

FILTER
指定要从目标中删除的行的 SQL WHERE 子句的内容。 例如,“DESCRIPTION= 'Inserted Record #1'”。

Delete 操作返回从目标中删除的行数。 以下代码显示了面向 ACCOUNTACTIVITY 表的 Delete 操作。

// Set filter string equal to the DESCRIPTION field of the target record  
string filter = "DESCRIPTION = 'Inserted Record #1'";  
  
try  
{  
    recsDeleted = aaTableClient.Delete(filter);  
}  
catch (Exception ex)  
{  
    // handle exception  
  
    ...  
}  
Console.WriteLine("{0} records deleted", recsDeleted);  

注意

此代码省略了创建、配置和打开 WCF 客户端实例的步骤。 有关包含这些步骤的示例,请参阅 插入操作

使用 WCF 服务模型调用基本 SQL 操作的限制

使用 WCF 客户端调用基本 SQL 操作时,存在以下限制:

  • 插入操作。 多记录插入操作中使用的记录集是强类型,因此包括所有行列。 Oracle 数据库适配器将记录中的 null 值解释为表示应从插入操作中排除列;但是,不能排除不可删除的列,因为不能将它们设置为 null 值。 因此,在执行多记录插入操作时,必须为不可删除列指定值。

  • 插入操作。 Oracle 数据库适配器将 Nillable 数据列中的 DbNull 值解释为应从多记录插入操作中排除该列。 这意味着不能在多记录插入操作中将 Oracle 数据库上的 nillable 列设置为 DbNull

  • 插入操作。 对涉及大型记录集的多个记录插入操作没有流式处理支持。

  • 更新操作。 更新操作中使用的模板记录是强类型记录,因此包括所有行列。 Oracle Database 适配器将此记录中的 null 值解释为表示应从更新操作中排除列;但是,不能排除不可删除的列,因为不能将其设置为 null 值。 因此,在执行更新操作时,必须为不可删除的列指定值。

  • 更新操作。 Oracle 数据库适配器将模板记录中 nillable 数据列中的 DbNull 值解释为应从操作中排除该列。 这意味着无法使用 Update 操作在 Oracle 数据库上将 nillable 列设置为 DbNull

  • 选择操作。 对返回大型记录集的 SELECT 查询没有流式处理支持。

    对于这些限制带来挑战的方案,可以使用 WCF 通道模型调用操作,原因如下:

  • 通过使用 WCF 通道模型,可以从“更新”和“插入”操作中排除特定数据列。

  • WCF 通道模型为 Oracle 数据库适配器公开的基本 SQL 操作提供节点级流式处理支持。

    有关将 WCF 通道模型与 Oracle 数据库适配器配合使用的详细信息,请参阅 使用 WCF 通道模型开发 Oracle 数据库应用程序

另请参阅

使用 WCF 通道模型开发 Oracle 数据库应用程序