次の方法で共有


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

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

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

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

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

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

    このようなシナリオでは、Oracle データベース アダプターによって 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 クラスを生成します。

    Von Bedeutung

    SQLEXECUTE 操作は、[アダプター サービス参照の追加] ダイアログ ボックスの [カテゴリの選択] ウィンドウのルート ノード (/) の下に表示されます。

  2. SQLEXECUTEClient クラスのインスタンスを作成し、SQLEXECUTE メソッドを呼び出して Oracle データベースで SQL ステートメントを実行します。

    WCF クライアント クラスを作成し、Oracle データベース アダプターに対する操作を呼び出す方法の詳細については、「 Oracle Database アダプターを使用した WCF サービス モデルの概要」を参照してください。

    次の例では、 SQLEXECUTEClient を使用して、次の SQL ステートメントを実行して、TID_SEQ Oracle SEQUENCE の次の値を取得 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 データベース アプリケーションを開発する