使用 WCF 服务模型在 Oracle 数据库中运行 SQLEXECUTE 操作

适用于 Oracle 数据库的 Microsoft BizTalk 适配器对 Oracle 数据库项目显示一组标准操作。 通过使用这些操作,可以执行调用 Oracle 函数或过程等操作,或者执行基本的 SQL 数据操作语言 (DML) 表上的操作。 但是,某些场景可能由业务逻辑驱动,需要执行 Oracle 数据库适配器未显示的操作。 例如,你可以采取以下建议:

  • 对 Oracle 数据库适配器未显示的数据库项目执行操作;例如,获取 Oracle SEQUENCE 的 CURVAL 或 NEXTVAL。

  • 执行数据定义语言操作;例如,创建表。

  • 对设计时不存在的数据库项目执行操作;例如,更新业务逻辑创建的临时表中的记录。

  • 对表执行比 Oracle 数据库适配器显示的操作更复杂的 DML 操作;例如,执行包含 JOIN 子句的查询。

    对于这些类型的方案,Oracle 数据库适配器会显示 SQLEXECUTE 操作。 通过使用 SQLEXECUTE 操作,可以对 Oracle 数据库执行参数化 SQL 语句。 SQLEXECUTE 操作支持由参数集组成的输入参数块,使你能够为每个集执行一次相同的 SQL 语句。 SQLEXECUTE 操作返回泛型记录集中 SQL 语句的结果。

关于本主题中使用的示例

本主题中的示例使用名为 TID_SEQ 的 Oracle SEQUENCE。 SDK 示例提供了用于生成此 SEQUENCE 的脚本。 有关 SDK 示例的详细信息,请参阅 SDK 中的示例

WCF 客户端类

WCF 服务模型为 SQLEXECUTE 操作生成专用 WCF 客户端 SQLEXECUTEClient。 下面的代码显示了 SQLEXECUTEClient 和调用 SQLEXECUTE 操作的方法的签名。

public partial class SQLEXECUTEClient : System.ServiceModel.ClientBase<SQLEXECUTE>, SQLEXECUTE {  
  
    ...  
  
    public microsoft.lobservices.oracledb._2007._03.GenRecordRow[] SQLEXECUTE(string SQLSTATEMENT, string PARAMETERSCHEMA, microsoft.lobservices.oracledb._2007._03.PARAMETERDATA[] PARAMETERSET);   
}  

SQLEXECUTE 操作返回一般记录集。 如果 SQLEXECUTE 操作执行的语句返回了任何) ,则此记录集包含 (的值。 可以将输入参数集传递给 PARAMETERDATA 对象集合中的 SQLEXECUTE 操作,其中每个对象都包含表示为字符串的输入参数的集合。 以下代码显示了 PARAMETERDATA 集的定义。

namespace microsoft.lobservices.oracledb._2007._03 {  
    using System.Runtime.Serialization;  
  
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]  
    [System.Runtime.Serialization.DataContractAttribute()]  
    public partial class PARAMETERDATA : object, System.Runtime.Serialization.IExtensibleDataObject {  
  
        ...  
  
        private string[] PARAMETERField;  
  
        ...  
  
        [System.Runtime.Serialization.DataMemberAttribute()]  
        public string[] PARAMETER {  
            get {  
                return this.PARAMETERField;  
            }  
            set {  
                this.PARAMETERField = value;  
            }  
        }  
    }  
}  

调用 SQLEXECUTE 操作

若要使用 WCF 客户端调用 SQLEXECUTE 操作,请执行以下步骤。

  1. 为目标表或视图生成 SQLEXECUTEClient 类。

    重要

    SQLEXECUTE 操作显示在“添加适配器服务引用”对话框中的“选择类别”窗格中的根节点 (/) 下。

  2. 创建 SQLEXECUTEClient 类的实例,并调用 SQLEXECUTE 方法对 Oracle 数据库执行 SQL 语句。

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

    以下示例使用 SQLEXECUTEClient 通过执行以下 SQL 语句来获取 Oracle SEQUENCE 的下一个值(TID_SEQ): SELECT tid_seq.nextval id from DUAL。 然后,输出将写入控制台。

using (SQLEXECUTEClient sqlClient = new SQLEXECUTEClient("OracleDBBinding_SQLEXECUTE"))  
{  
    sqlClient.ClientCredentials.UserName.UserName = "SCOTT";  
    sqlClient.ClientCredentials.UserName.Password = "TIGER";  
    try  
    {  
        sqlClient.Open();  
    }  
    catch (Exception ex)  
    {  
        Console.WriteLine("Error opening SQL client " + ex.Message);  
        throw;  
    }  
    microsoft.lobservices.oracledb._2007._03.GenRecordRow[] sequenceRec =   
        new microsoft.lobservices.oracledb._2007._03.GenRecordRow[0];  
  
    try  
    {  
        sequenceRec = sqlClient.SQLEXECUTE("SELECT tid_seq.nextval id from DUAL", null, null);  
    }  
    catch (Exception ex)  
    {  
        Console.WriteLine("Error executing SQL client " + ex.Message);  
        throw;  
    }  
  
    if (sequenceRec.Length > 0)  
    {  
        Console.WriteLine("TID_SEQUENCE value is {0}", sequenceRec[0].GenRecordColumn[0].ColumnValue);  
    }  
    else  
    {  
    Console.WriteLine("Couldn't get next TID_SEQUENCE value");  
    }  
}  

另请参阅

使用 WCF 服务模型开发 Oracle 数据库应用程序