在 Oracle 数据库中使用 WCF 服务模型运行 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 对象都包含一组作为字符串表示的输入参数。 以下代码显示了 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 服务模型概述

    以下示例通过执行以下 SQL 语句,使用 SQLEXECUTEClient 获取 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 数据库应用程序