次の方法で共有


WCF サービス モデルを使用して Oracle Database で SQLEXECUTE 操作を実行する

Microsoft BizTalk Adapter for Oracle Database では、Oracle データベース成果物に対する標準の操作セットが表示されます。 これらの操作を使用すると、Oracle 関数やプロシージャを呼び出したり、テーブルに対して基本的な SQL データ操作言語 (DML) 操作を実行したりできます。 ただし、Oracle Database アダプターが表示されない操作を実行する必要がある、ビジネス ロジックに基づくシナリオが存在する場合があります。 たとえば、次のような場合があります。

  • Oracle Database アダプターによって表示されないデータベース成果物に対して操作を実行します。たとえば、Oracle シーケンスのカーバルまたは NEXTVAL を取得します。

  • データ定義言語操作を実行する。たとえば、テーブルを作成します。

  • デザイン時に存在しなかったデータベース成果物に対して操作を実行します。たとえば、ビジネス ロジックによって作成された一時テーブル内のレコードを更新します。

  • Oracle Database アダプターが実行する操作よりも、テーブルに対してより複雑な DML 操作を実行します。たとえば、JOIN 句を含むクエリを実行する場合です。

    このようなシナリオでは、Oracle Database アダプターによって SQLEXECUTE 操作が表示されます。 SQLEXECUTE 操作を使用すると、Oracle データベースに対してパラメーター化された SQL ステートメントを実行できます。 SQLEXECUTE 操作では、各セットに対して同じ SQL ステートメントを 1 回実行できるパラメーター セットで構成される入力パラメーター ブロックがサポートされています。 SQLEXECUTE 操作は、汎用レコード セット内の SQL ステートメントの結果を返します。

このトピックで使用する例について

このトピックの例では、TID_SEQ という名前の Oracle SEQUENCE を使用します。 この SEQUENCE を生成するスクリプトは、SDK サンプルと共に提供されます。 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 ステートメントを実行します。

    WCF クライアント クラスを作成し、Oracle Database アダプターで操作を呼び出す方法の詳細については、「 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 Database アプリケーションを開発する