在 Oracle Database 中使用 WCF 服务模型运行 SQLEXECUTE 操作

用于 Oracle Database 的 Microsoft.windowsazure.cloudconfigurationmanager BizTalk 适配器用于对 Oracle 数据库项目执行一组标准操作。 通过使用这些操作,您可以执行一些操作,例如调用 Oracle 函数或过程,或执行基本 SQL 数据操作语言 (DML) 对表执行的操作。 但是,可能存在由业务逻辑驱动的方案,这些方案要求你执行 Oracle Database 适配器不显示的操作。 例如,你可能想要:

  • 对不是由 Oracle Database 适配器显示的数据库项目执行操作;例如,获取 Oracle 序列的 CURVAL 或 NEXTVAL。

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

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

  • 对表执行更复杂的 DML 操作,而不是 Oracle Database 适配器表面的操作;例如,若要执行包含 JOIN 子句的查询。

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

有关本主题中使用的示例

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

WCF 客户端类

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

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 语句。

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

    下面的示例使用SQLEXECUTEClient通过执行以下 SQL 语句来获取 Oracle 序列的下一个值 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 Database 应用程序