次の方法で共有


WCF サービス モデルを使用した Oracle Database の挿入、更新、削除、または選択操作

Microsoft BizTalk Adapter for Oracle Database には、Oracle データベースのテーブルとビューに対する基本的な挿入、更新、削除、および選択の一連の操作が表示されます。 これらの操作を使用すると、ターゲット テーブルまたはビューで WHERE 句によって修飾された単純な SQL INSERT、UPDATE、SELECT、および DELETE ステートメントを実行できます。 JOIN 演算子を使用する SQL SELECT クエリなど、より複雑な操作を実行するには、SQLEXECUTE 操作を使用します。 SQLEXECUTE 操作の詳細については、「 WCF サービス モデルを使用した Oracle データベースでの SQLEXECUTE 操作の実行」を参照してください。

次の表は、Oracle Database アダプターがテーブルとビューに対して実行する基本的な SQL 操作をまとめたものです。 これらの操作の詳細については、「 テーブルとビューに対する基本的な挿入、更新、削除、および選択操作のメッセージ スキーマ」を参照してください。

操作 説明
挿入 挿入操作では、ターゲット テーブルまたはビューへの複数のレコードまたは一括挿入がサポートされます。

- 複数レコード挿入操作では、指定されたレコード セットに基づいてテーブルまたはビューに行が挿入されます。
- 一括挿入操作では、指定された SQL SELECT クエリと列リストに基づいて、テーブルまたはビューに行が挿入されます。 クエリから返されるレコードは、列リストに基づいてターゲット テーブルに挿入されます。
Select 指定された列名のリストと SQL WHERE 句を指定するフィルター文字列に基づいて、ターゲット テーブルに対して SQL SELECT クエリを実行します。
更新 ターゲット テーブルに対して UPDATE を実行します。 更新するレコードは、SQL WHERE 句を指定するフィルター文字列によって指定されます。 更新の値は、テンプレート レコードで指定されます。
削除 フィルター文字列で指定された SQL WHERE 句に基づいて、ターゲット テーブルに対して DELETE を実行します。

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

このトピックの例では、/SCOTT/ACCOUNTACTIVITY テーブルを使用します。 このテーブルを生成するスクリプトは、SDK サンプルと共に提供されます。 SDK サンプルの詳細については、「SDK のサンプル」を参照してください。

WCF クライアント クラス

Oracle Database アダプターが表示する基本的な SQL 操作用に生成される WCF クライアントの名前は、次の表に示すように、テーブルまたはビューの名前に基づいています。

Oracle Database Artifact WCF クライアント名
テーブル [SCHEMA]Table[TABLE_NAME]Client
表示 [SCHEMA]View[VIEW_NAME]Client

[SCHEMA] = Oracle 成果物のコレクション。たとえば、SCOTT です。

[TABLE_NAME] = テーブルの名前。たとえば、ACCOUNTACTIVITY です。

[VIEW_NAME] = ビューの名前。

次の表は、テーブルに対する基本的な SQL 操作のメソッド シグネチャを示しています。 ビューのシグネチャは同じですが、ビューの名前空間と名前がテーブルの名前に置き換えられる点が除きます。

操作 メソッド シグネチャ
挿入 long Insert([TABLE_NS].[TABLE_NAME]RECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY);
Select [TABLE_NS]。[TABLE_NAME]RECORDSELECT[] Select(string COLUMN_NAMES, string FILTER);
更新 long Update([TABLE_NS].[TABLE_NAME]RECORDUPDATE RECORDSET, string FILTER);
削除 Long Delete(string FILTER);

[TABLE_NS] = テーブル名前空間の名前。たとえば、microsoft.lobservices.oracledb._2007._03.SCOTT です。Table.ACCOUNTACTIVITY。

[TABLE_NAME] = テーブルの名前。たとえば、ACCOUNTACTIVITY です。

挿入、更新、および Select 操作で使用されるレコードの種類はすべて、テーブルまたはビューの名前空間で定義されます。

次のコードは、/SCOTT/ACCOUNTACTIVITY テーブルに対する Delete、Insert、Select、Update 操作に対して生成された WCF クライアント クラスのメソッド シグネチャを示しています。

public partial class SCOTTTableACCOUNTACTIVITYClient : System.ServiceModel.ClientBase<SCOTTTableACCOUNTACTIVITY>, SCOTTTableACCOUNTACTIVITY {  
  
    public long Delete(string FILTER);  
  
    public long Insert(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] RECORDSET, string COLUMN_NAMES, string QUERY);  
  
    public microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] Select(string COLUMN_NAMES, string FILTER);  
  
    public long Update(microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE RECORDSET, string FILTER);  
}  

基本的な SQL 操作の呼び出し

WCF クライアントを使用してテーブルまたはビューに対する基本的な SQL 操作を呼び出すには、次の手順を実行します。

  1. ターゲット テーブルまたはビューの WCF クライアント クラスを生成します。 このクラスには、ターゲット成果物で呼び出す操作のメソッドが含まれている必要があります。

  2. WCF クライアント クラスのインスタンスを作成し、そのメソッドを呼び出して、テーブルまたはビューに対する操作を実行します。

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

    Oracle データベース アダプターは、Oracle データベース上のトランザクション内で各操作を実行します。 TransactionIsolationLevel バインド プロパティを設定することで、このトランザクションの分離レベルを制御できます。 Oracle データベース アダプターのバインド プロパティの詳細については、「 BizTalk Adapter for Oracle Database Binding Properties の操作」を参照してください。

    次のセクションでは、コード内の各基本的な SQL 操作を呼び出す方法について詳しく説明します。

挿入操作

次の表は、複数のレコードの挿入操作と一括挿入操作のパラメーターを設定する方法を示しています。

挿入操作の種類 レコード COLUMN_NAMES QUERY
複数のレコード ターゲットに挿入する必要がある INSERTRECORDS のコレクション。 null null
一括 null ターゲット内の列名のコンマ区切りのリスト。たとえば、"TID, ACCOUNT" です。 列リストは、挿入された各行にクエリ結果を配置する列を指定します。 クエリは、数値と型の両方で列リストで指定された列と一致する結果セットを返す必要があります。 ターゲットに挿入する結果セットを返すデータベース テーブルまたはビューに対する SQL SELECT クエリ。たとえば、"SELECT (TID, ACCOUNT) FROM NEW_TRANSACTIONS WHERE ACCOUNT = 100001" などです。 結果セットは、数値と型の両方の列リストと一致する必要があります。

挿入操作は、ターゲットに挿入されたレコードの数を返します。

重要

WCF サービス モデルでは、挿入操作で使用されるレコード セットは厳密に型指定されます。 挿入操作からその列を除外するには、レコード内の nillable 列の値を null に設定できます。ただし、null 以外の列の値を null に設定することはできません。 つまり、複数のレコードの挿入操作では、各レコードのすべての非許容列の値を指定する必要があります。 さらに、WCF サービス モデルを使用する場合、基本的な SQL 操作のストリーミング サポートはありません。 複数のレコード挿入操作に大きなレコード セットが含まれている場合は、これが重要な考慮事項である可能性があります。 詳細については、「 WCF サービス モデルを使用した基本的な SQL 操作の呼び出しの制限事項」を参照してください。

次のコードは、ACCOUNTACTIVITY テーブルを対象とする複数レコードの挿入操作 (2 つのレコード) を示しています。

// Insert records  
                using (SCOTTTableACCOUNTACTIVITYClient aaTableClient =   
                    new SCOTTTableACCOUNTACTIVITYClient("OracleDBBinding_SCOTT.Table.ACCOUNTACTIVITY"))  
                {  
                    long recsInserted;  
  
                    aaTableClient.ClientCredentials.UserName.UserName = "SCOTT";  
                    aaTableClient.ClientCredentials.UserName.Password = "TIGER";  
  
                    try  
                    {  
                        aaTableClient.Open();  
                    }  
                    catch (Exception ex)  
                    {  
                        // handle exception  
                        Console.WriteLine("Exception: " + ex.Message);  
                        throw;  
                    }  
  
                    // Do a multiple record Insert of 2 records for account 100001  
  
                    microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[] insertRecs =  
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT[2];  
  
                                  TID__COMPLEX_TYPE tid = new TID__COMPLEX_TYPE();  
                                  tid.InlineValue = "tidSequence.NextVal()";  
  
                                  ACCOUNT__COMPLEX_TYPE account = new ACCOUNT__COMPLEX_TYPE();  
                                  account.Value = 100001;  
  
                    AMOUNT__COMPLEX_TYPE amount = new AMOUNT__COMPLEX_TYPE();  
                    amount.Value = 400;  
  
                    TRANSDATE__COMPLEX_TYPE transdate = new TRANSDATE__COMPLEX_TYPE();  
                    transdate.Value = DateTime.Now.Date;  
  
                    PROCESSED__COMPLEX_TYPE processed = new PROCESSED__COMPLEX_TYPE();  
                    processed.Value = "n";  
  
                    DESCRIPTION__COMPLEX_TYPE description1 = new DESCRIPTION__COMPLEX_TYPE();  
                    description1.Value = "Inserted Record #1";  
  
                    DESCRIPTION__COMPLEX_TYPE description2 = new DESCRIPTION__COMPLEX_TYPE();  
                    description2.Value = "Inserted Record #2";  
  
                    insertRecs[0] =   
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();  
                    insertRecs[0].TID = tid;  
                    insertRecs[0].ACCOUNT = account;  
                    insertRecs[0].AMOUNT = amount;  
                    insertRecs[0].TRANSDATE = transdate;  
                    insertRecs[0].DESCRIPTION = description1;  
                    insertRecs[0].PROCESSED = processed;  
  
                    insertRecs[1] =   
                        new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDINSERT();  
                    insertRecs[1].TID = tid;  
                    insertRecs[1].ACCOUNT = account;  
                    insertRecs[1].AMOUNT = amount;  
                    insertRecs[1].TRANSDATE = transdate;  
                    insertRecs[1].DESCRIPTION = description2;  
                    insertRecs[1].PROCESSED = processed;  
  
                    try  
                    {  
                        recsInserted = aaTableClient.Insert(insertRecs, null, null);  
                    }  
                    catch (Exception ex)  
                    {  
                        // handle exception  
                        Console.WriteLine("Exception: " + ex.Message);  
                        throw;  
                    }  
  
                    Console.WriteLine("Insert Done: {0} records inserted", recsInserted);  

操作の選択

次の表に、Select 操作のパラメーターを示します。

COLUMN_NAMES FILTER
ターゲット内の列名のコンマ区切りのリスト。たとえば、"TID, ACCOUNT" です。 列リストは、結果セットで返されるターゲットの列を指定します。 列リストで指定されていない列は、返されるレコード セットの .NET 既定値に設定されます。 nillable 列の場合、この値は null です クエリのターゲット行を指定する SQL WHERE 句の内容。たとえば、"DESCRIPTION = 'Insert Record #1' などです。 このパラメーターを null に設定すると、ターゲットのすべての行を返すことができます。

Select 操作は、ターゲットの行の種類に基づいて、厳密に型指定されたレコード セットを返します。

重要

WCF サービス モデルを使用する場合、基本的な SQL 操作のストリーミング サポートはありません。 クエリが大きなレコード セットを返す場合は、WCF チャネル モデルを使用してパフォーマンスを向上させることができます。 詳細については、「 WCF サービス モデルを使用した基本的な SQL 操作の呼び出しの制限事項」を参照してください。

次のコードは、ACCOUNTACTIVITY テーブルを対象とする Select 操作を示しています。 返されたレコードはコンソールに書き込まれます。

// Declare a variable to hold the result set  
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDSELECT[] selectRecords;  
  
// Select all records and write them to the console  
try  
{  
    selectRecords = aaTableClient.Select("*", null);  
}  
catch (Exception ex)  
{  
    // handle exception  
}  
  
Console.WriteLine("ACCOUNTACTIVITY before any operations");  
for (int i = 0; i \< selectRecords.Length; i++)  
{  
    Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", selectRecords[i].TID,  
    selectRecords[i].ACCOUNT,  
    selectRecords[i].AMOUNT,  
    selectRecords[i].TRANSDATE,  
    selectRecords[i].DESCRIPTION);  
}  

Note

このコードでは、WCF クライアント インスタンスを作成、構成、および開く手順を省略しています。 これらの手順を含む例については、「 挿入操作」を参照してください。

更新操作

次の表は、Update 操作のパラメーターを示しています。

レコード FILTER
ターゲットの行の種類に基づいて厳密に型指定されたテンプレート レコード。 テンプレート レコードは、ターゲット行の更新値を指定します。 nillable 行列の場合は、null 値を指定して、ターゲット行で列を更新しないことを示すことができます。 ターゲットで更新する行を指定する SQL WHERE 句の内容。 たとえば、"DESCRIPTION= 'Inserted Record #1' などです。

Update 操作は、ターゲットから削除された行の数を返します。

重要

WCF サービス モデルでは、Update 操作で使用されるテンプレート レコードが厳密に型指定されます。 列が nillable の場合は、テンプレート レコードでその値を null に設定することで、Update 操作から列を省略できます。ただし、列が nillable でない場合は、テンプレート レコードでその値を設定する必要があります。 たとえば、列が主キーの場合は、値を含める必要があります。 詳細については、「 WCF サービス モデルを使用した基本的な SQL 操作の呼び出しの制限事項」を参照してください。

次のコードは、ACCOUNTACTIVITY テーブルを対象とする Update 操作を示しています。

long recsUpdated;  
  
...  
  
// Create updated template. The TID, TIME, AMOUNT, and DESCRIPTION fields will be updated  
microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE updateRecord =  
    new microsoft.lobservices.oracledb._2007._03.SCOTT.Table.ACCOUNTACTIVITY.ACCOUNTACTIVITYRECORDUPDATE();  
        updateRecord.TID = tidSequence.NextVal();  
        updateRecord.ACCOUNT = null;  
        updateRecord.AMOUNT = 300;  
        updateRecord.TRANSDATE = DateTime.Now.Date;  
        updateRecord.DESCRIPTION = "Updated Record #2";  
        updateRecord.PROCESSED = null;  
  
// Set filter string to specify the target record by using the DESCRIPTION field  
string filter = "DESCRIPTION = 'Inserted Record #2'";  
  
try  
{  
    recsUpdated = aaTableClient.Update(updateRecord, filter);  
}  
catch (Exception ex)  
{  
    // handle exception  
    ...  
}  
  
Console.WriteLine("{0} records updated", recsUpdated);  

Note

このコードでは、WCF クライアント インスタンスを作成、構成、および開く手順を省略しています。 これらの手順を含む例については、「 挿入操作」を参照してください。

削除操作。

次の表に、Delete 操作のパラメーターを示します。

FILTER
ターゲットから削除する行を指定する SQL WHERE 句の内容。 たとえば、"DESCRIPTION= 'Inserted Record #1' などです。

Delete 操作は、ターゲットから削除された行の数を返します。 次のコードは、ACCOUNTACTIVITY テーブルを対象とする Delete 操作を示しています。

// Set filter string equal to the DESCRIPTION field of the target record  
string filter = "DESCRIPTION = 'Inserted Record #1'";  
  
try  
{  
    recsDeleted = aaTableClient.Delete(filter);  
}  
catch (Exception ex)  
{  
    // handle exception  
  
    ...  
}  
Console.WriteLine("{0} records deleted", recsDeleted);  

Note

このコードでは、WCF クライアント インスタンスを作成、構成、および開く手順を省略しています。 これらの手順を含む例については、「 挿入操作」を参照してください。

WCF サービス モデルを使用した基本的な SQL 操作の呼び出しに関する制限事項

WCF クライアントを使用して基本的な SQL 操作を呼び出す場合、次の制限があります。

  • 挿入操作。 複数のレコード挿入操作で使用されるレコード セットは厳密に型指定されているため、すべての行列が含まれます。 Oracle Database アダプターは、レコード内の null 値を解釈して、列を挿入操作から除外する必要があることを意味します。ただし、null 値に設定できないため、非許容列を除外することはできません。 したがって、複数のレコード挿入操作を実行する場合は、非許容列の値を指定する必要があります。

  • 挿入操作。 Oracle Database アダプターは、nillable データ列の DbNull 値を解釈して、複数レコードの挿入操作から列を除外する必要があることを意味します。 つまり、複数のレコード挿入操作で Oracle データベースの nillable 列を DbNull に設定することはできません。

  • 挿入操作。 大きなレコード セットを含む複数のレコード挿入操作に対するストリーミングサポートはありません。

  • 更新操作。 Update 操作で使用されるテンプレート レコードは厳密に型指定されているため、すべての行列が含まれます。 Oracle Database アダプターは、このレコードの null 値を解釈して、列を Update 操作から除外する必要があることを意味します。ただし、null 値にすることはできませんので、非許容列を除外することはできません。 したがって、Update 操作を実行する場合は、非許容列の値を指定する必要があります。

  • 更新操作。 Oracle Database アダプターは、テンプレート レコードの nillable データ列の DbNull 値を解釈して、その列を操作から除外する必要があることを意味します。 つまり、Update 操作を使用して、Oracle データベースの nillable 列を DbNull に設定することはできません。

  • 操作を選択します。 大きなレコード セットを返す SELECT クエリのストリーミングサポートはありません。

    これらの制限が課題となるシナリオでは、次の理由から WCF チャネル モデルを使用して操作を呼び出すことができます。

  • WCF チャネル モデルを使用すると、Update 操作と Insert 操作から特定のデータ列を除外できます。

  • WCF チャネル モデルは、Oracle Database アダプターが公開する基本的な SQL 操作に対するノード レベルのストリーミング サポートを提供します。

    Oracle Database アダプターで WCF チャネル モデルを使用する方法の詳細については、「WCF チャネル モデルを 使用した Oracle データベース アプリケーションの開発」を参照してください。

参照

WCF チャネル モデルを使用した Oracle データベース アプリケーションの開発