Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

SQL のアダプタ・メソッドの作成

この章では、EnsLib.SQL パッケージに用意されているツールを使用して、SQL タスクを実行するアダプタ・メソッドを記述する方法について説明します。通常、送信アダプタを使用する場合にこのようなメソッドを記述します。この章では、以下のトピックについて説明します。

概要および状況

さまざまな場合に、SQL タスクを実行するメソッドを記述する必要があります。最も一般的な場合は、以下のとおりです。

  • SQL 送信アダプタを使用する場合は、メッセージ・ハンドラを記述し、このメソッドをアダプタのメッセージ・マップに追加します。そうすると、例えば、ビジネス・オペレーションが特定のタイプのメッセージを受信した場合に、メッセージ・ハンドラが特定のテーブルにレコードを追加できます。

  • ビジネス・ホストのスタートアップまたはティアダウンをカスタマイズする場合は、カスタムの OnInit() または OnTearDown() メソッドによって特定のテーブルを初期化またはクリーンアウトできます。

このようなタスクを実行するには、カスタム・メソッドで SQL 受信アダプタと送信アダプタのメソッドを使用します。どちらも、EnsLib.Common クラスからメソッドのコア・セットを継承しています。これらのメソッドでは、クエリの実行、ストアド・プロシージャの実行、レコードの挿入などができます。

パラメータの使用

クエリ、更新、またはプロシージャを実行する際にパラメータを使用する場合は、使用している ODBC ドライバに関する情報を入手する必要があります。入手する情報は以下のとおりです。

  • このドライバが ODBC SQLDescribeParam 関数をサポートしているかどうか。ほとんどのドライバはこの関数をサポートしています。

    • サポートしている場合は、SQL アダプタ・メソッド ExecuteQuery() および ExecuteUpdate() を使用できます。これらの各メソッドでは、任意の数のパラメータ名を受け入れ、SQLDescribeParam を呼び出し、その結果得た情報を使用して自動的にまた適切にこれらのパラメータをバインドします。

    • サポートしていない場合は、代替メソッド ExecuteQueryParmArray() および ExecuteUpdateParmArray() を使用する必要があります。このような場合は、パラメータとそのすべての属性を含む多次元配列を作成して渡す必要があります。

  • このドライバが ODBC SQLDescribeProcedureColumns 関数をサポートしているかどうか。ほとんどのドライバはこの関数をサポートしています。

    • サポートしている場合は、SQL アダプタ・メソッド ExecuteProcedure() を使用できます。このメソッドでは、任意の数のパラメータ名を受け入れ、SQLDescribeProcedureColumns を呼び出し、その結果得た情報を使用して自動的にまた適切にこれらのパラメータをバインドします。

    • サポートしていない場合は、代替メソッド ExecuteProcedureParmArray() を使用する必要があります。このような場合は、パラメータとそのすべての属性を含む多次元配列を作成して渡す必要があります。

      ドライバが SQLDescribeProcedureColumns をサポートしていない場合は、使用する各パラメータが入力、出力、または入出力のどのタイプのパラメータかを指定する必要もあります。

パラメータ属性

ODBC ドライバが SQLDescribeParam または SQLDescribeProcedureColumns 関数をサポートしていない場合、SQL 文でパラメータを使用するには、パラメータとそのすべての関連属性を含む Caché 多次元配列を作成する必要があります。Ensemble はこれらの値を使用して、各パラメータを適切にバインドする方法をドライバに問い合わせます。

  • SQL データ型 — Ensemble では、通常、整数 (SqlType 値) によって表現されます。Ensemble インクルード・ファイル EnsSQLTypes.inc には、一般に使用される値の定義が含まれています。以下にいくつか例を示します。

    • 1 は SQL_CHAR を表します。

    • 4 は SQL_INTEGER を表します。

    • 6 は SQL_FLOAT を表します。

    • 8 は SQL_DOUBLE を表します。

    • 12 は SQL_VARCHAR を表します。

    このインクルード・ファイルには、SqlDB2BLOB や SqlDB2CLOB などの拡張データ型もリストされています。Ensemble では、これらのデータ型もサポートしています。

    しかし、データベース・ドライバのドキュメントを参照して、ドライバが使用する値に、Ensemble が認識しない非標準の値が含まれていないか確認してください。

  • 精度 — 数値パラメータの場合は、通常、パラメータのデータ型で使用される最大桁数を意味します。例えば、CHAR(10) 型のパラメータの場合、精度は 10 です。数値以外のパラメータの場合は、通常、パラメータの最大長を意味します。

  • スケール — 数値パラメータの場合は、小数点の右側に格納できる最大桁数を意味します。数値以外のパラメータには使用できません。

Caché の多次元配列でのパラメータの指定

ExecuteQueryParmArray()ExecuteUpdateParmArray()、および ExecuteProcedureParmArray() メソッドを使用するには、最初に、パラメータとその値を保持する Caché 多次元配列を作成します。次に、メソッド・シグニチャに示されるような引数リストで、この配列を使用します。この配列には任意の数のパラメータを含めることができ、配列の構造は以下のようにする必要があります。

ノード コンテンツ
arrayname パラメータ数を示します。
arrayname(integer) integer が指定する位置にあるパラメータの値。
arrayname(integer,"SqlType") このパラメータの SqlType (必要な場合)。これは SQL データ型に対応する数字です。オプションについては、前の節を参照してください。詳細は、“SqlType と CType の値” を参照してください。
arrayname(integer,"CType") このパラメータのローカル Caché タイプ (必要な場合)。これは SQL データ型に対応する数字です。オプションについては、前の節を参照してください。詳細は、“SqlType と CType の値” を参照してください。
arrayname(integer,"Prec") このパラメータの精度 (必要な場合)。前の節を参照してください。デフォルトは 255 です。
arrayname(integer,"Scale") このパラメータのスケール (必要な場合)。前の節を参照してください。デフォルトは 0 です。
arrayname(integer,"IOType") プロシージャのフラグを上書きする必要がある場合の、このパラメータの IOType。これは、ExecuteProcedureParmArray() メソッドのみで使用されます。
  • 1 は入力パラメータを表します。

  • 2 は入出力パラメータを表します。

  • 4 は出力パラメータを表します。

arrayname(integer,"SqlTypeName") ドライバからパラメータ値を取得するための呼び出しと、SqlType 添え字のみが与えられている場合の CType の計算で使用されます。
arrayname(integer,"LOB") このパラメータが “ラージ・オブジェクト” であるかどうかを指定するブーリアン値。
arrayname(integer,"Bin") このパラメータが文字データではなくバイナリ・データを含むかどうかを指定するブーリアン値。
Important:

パラメータ配列を使用するクエリを複数実行する場合は、各クエリの実行前にパラメータ配列を破棄して、再作成します。

ExecuteQueryParmArray()ExecuteUpdateParmArray()、および ExecuteProcedureParmArray() メソッドは、最初に、指定されたパラメータ配列に記述子の添え字が含まれているかどうかをチェックします。(Ensemble では特に、最初のパラメータに "CType" または "SqlType" の添え字がないかチェックします)。次に、以下の手順を実行します。

  • 配列に記述子の添え字が含まれていない場合、メソッドは必要に応じて ODBC 関数の SQLDescribeParam または SQLDescribeProcedureColumns 関数のどちらかを呼び出し、その関数によって返される値を使用します。

  • 配列に記述子の添え字が含まれている場合、メソッドはその添え字を使用します。

また、ExecuteProcedure() による DescribeProcedureColumns の呼び出しを阻止することもできます (デフォルトでは呼び出されます)。そのためには、pIO 引数の末尾にアスタリスク (*) を付加します。この章の “ストアド・プロシージャの実行” を参照してください。

SqlType と CType の値

任意のパラメータで "SqlType""CType" の両方の添え字を指定できます。そのほうが "SqlType" の添え字のみを使用するよりも簡単です。

任意の指定パラメータに対して、使用値が以下のように決定されます。

シナリオ "SqlType" の添え字 "CType" の添え字 使用される実際の "SqlType" 使用される実際の "CType"
1 指定 指定なし "SqlType" 添え字の値 "SqlType" 値から自動計算されます。
2 指定なし 指定 "SqlType" 添え字の値 ("CType" 添え字からのコピーによって自動的に定義されます)
3 指定なし 指定なし 可能な場合は、データ・ソースに対するクエリによって自動的に値が決定されます。それ以外の場合は 12 (SQL_VARCHAR) が使用されます。
4 指定 指定 "SqlType" 添え字の値 "CType" 添え字の値

クエリの実行

受信アダプタまたはビジネス・サービス内でクエリを実行できます。クエリを実行するには、アダプタの ExecuteQuery() または ExecuteQueryParmArray() メソッドを使用します。これらのメソッドは、EnsLib.SQL.GatewayResultSetOpens in a new tab および EnsLib.SQL.SnapshotOpens in a new tab ヘルパ・クラスを使用します。2 つのクラスの相違点は以下のとおりです。

  • 結果セット (EnsLib.SQL.GatewayResultSetOpens in a new tab のインスタンス) は初期化が必要です。初期化されると、データ・ソースに対してライブ・データ接続するようになります。

  • 一方、スナップショット (EnsLib.SQL.SnapshotOpens in a new tab のインスタンス) は、さまざまな方法で作成および設定できる静的オブジェクトです。例えば、結果セットのデータ、つまり、すべての行または行のサブセット (任意の行位置から開始) のいずれかを使用して作成できます。後の章で、スナップショットを作成するの他の方法について説明します。

Note:

ここでは、結果セットとスナップショットの取得方法について説明します。使用法については説明しません。これらのオブジェクトの使用法の詳細は、“結果セットの使用法” の章と “スナップショットの使用法” の章を参照してください。

モードの使用

ExecuteQuery() または ExecuteQueryParmArray() メソッドを使用すると、メソッドの呼び出し方法に応じて結果セットまたはスナップショットのどちらかを (参照によって) 取得できます。これらのメソッドを使用するには、以下の手順を実行します。

  1. アダプタが DSN に接続していることを確認します。

  2. スナップショット・オブジェクトを受信するには、以下の手順を実行します。

    1. EnsLib.SQL.SnapshotOpens in a new tab の新しいインスタンスを作成します。

    2. オプションで、そのインスタンスの FirstRow プロパティと MaxRowsToGet プロパティの値を指定します。

  3. ExecuteQuery() または ExecuteQueryParmArray() メソッドを呼び出して、以下の引数をメソッドに渡します。

    1. スナップショット・インスタンス (ある場合)

    2. クエリを含む文字列

    3. クエリおよびメソッドのどちらか適切な方のパラメータ (次の節を参照)

スナップショット・インスタンスを用意しない場合は、メソッドから結果セットが返されます。スナップショット・インスタンスをメソッドに渡すと、メソッドは新しい結果セットを作成し、この結果セットを使用してスナップショット・インスタンスを設定し (行の選択に FirstRow プロパティおよび MaxRowsToGet プロパティを使用し)、次にスナップショットを返します。

メソッドの構文

クエリを実行するには、以下のメソッドのいずれかを使用します。

ExecuteQuery()
Method ExecuteQuery(ByRef pRS As EnsLib.SQL.GatewayResultSet,
                pQueryStatement As %String,
                pParms...) As %Status

クエリを実行します。クエリ文字列と任意の数のパラメータを指定します。結果は、最初の引数に参照渡しで返されます。前述のとおり、結果は EnsLib.SQL.GatewayResultSetOpens in a new tab または EnsLib.SQL.SnapshotOpens in a new tab のインスタンスになります。

2 番目の引数は、実行するクエリ文です。このクエリ文には、置き換え可能なパラメータを表す標準の SQL ? を使用できます。この文には UPDATEは使用しないでください。

ExecuteQueryParmArray()
Method ExecuteQueryParmArray(ByRef pRS As EnsLib.SQL.GatewayResultSet,
                pQueryStatement As %String,
                ByRef pParms) As %Status

クエリを実行します。このメソッドは上記のメソッドと似ていますが、パラメータの指定方法が異なります。このメソッドの場合は、この章の前述の “Caché の多次元配列でのパラメータの指定” で説明したとおり、Caché の多次元配列 (pParms) にパラメータを指定します。

ExecuteQueryParmArray() メソッドは、パラメータを指定する必要があるときに、使用している ODBC ドライバが ODBC SQLDescribeParam 関数をサポートしていない場合に使用します。

以下に、クエリを実行するメソッドの例を示します。

Method GetPhone(pRequest As ESQL.GetPhoneNumberRequest,
  Output pResponse As ESQL.GetPhoneNumberResponse) As %Status
{
   Set pResponse = ##class(ESQL.GetPhoneNumberResponse).%New()
   //need to pass tResult by reference explicitly in ObjectScript
   //Use an adapter to run a query in the Employee database.
   Set tSC = ..Adapter.ExecuteQuery(.tResult,
"Select "_pRequest.Type_" from Employee where EmployeeID="_pRequest.ID)

 //Get the result
   If tResult.Next() {
     Set pResponse.PhoneNumber = tResult.GetData(1)
   } Else {
   //Handle no phone number for example
     Set pResponse.PhoneNumber = ""
   }
   Quit $$$OK
}

更新、挿入、および削除の実行

データベースの更新、挿入、または削除を実行するには、以下のメソッドのいずれかを使用します。

ExecuteUpdate()
Method ExecuteUpdate(Output pNumRowsAffected As %Integer,
                pUpdateStatement As %String,
                pParms...) As %Status

INSERT、UPDATE、または DELETE 文を実行します。この文には、使用するパラメータを任意の数だけ渡すことができます。注 :

  • 対象の行数が最初の引数に出力として返されます。

  • 2 番目の引数は、実行する INSERT、UPDATE、または DELETE 文です。このクエリ文には、置き換え可能なパラメータを表す標準の SQL ? を使用できます。

ExecuteUpdateParmArray()
Method ExecuteUpdateParmArray(Output pNumRowsAffected As %Integer,
                pUpdateStatement As %String,
                ByRef pParms) As %Status

INSERT、UPDATE、または DELETE 文を実行します。このメソッドは上記のメソッドと似ていますが、パラメータの指定方法が異なります。このメソッドの場合は、この章の前述の “Caché の多次元配列でのパラメータの指定” で説明したとおり、Caché の多次元配列 (pParms) にパラメータを指定します。

ExecuteUpdateParmArray() メソッドは、パラメータを指定する必要があるときに、使用している ODBC ドライバが ODBC SQLDescribeParam 関数をサポートしていない場合に使用します。

以下の例では、ExecuteUpdate() メソッドを使用しています。

/// Insert into NewCustomer table
Method Insert(pReq As ESQL.request,
   Output pResp As ESQL.response1) As %Status
{
 kill pResp
 set pResp=$$$NULLOREF

 set sql="insert into NewCustomer (Name,SSN,City) values (?,?,?)"

 //perform the Insert
 set tSC = ..Adapter.ExecuteUpdate(.nrows,sql,pReq.Name,pReq.SSN,pReq.City)

 //create the response message
 set pResp=##class(ESQL.response1).%New()
 set pResp.AffectedRows=nrows

 if 'tSC write " failed ",tSC quit tSC
 quit 1
}

ExecuteUpdateParmArray の使用例

以下の例は、この章内の前の部分で示した ExecuteUpdate()と同等です。ここでは ExecuteUpdateParmArray() メソッドを使用しています。

/// Insert into NewCustomer table
Method InsertWithParmArray(pReq As ESQL.request,
   Output pResp As ESQL.response1) As %Status
{
 kill pResp
 set pResp=$$$NULLOREF

 set sql="insert into NewCustomer (Name,SSN,City) values (?,?,?)"

 //set up multidimensional array of parameters
 //for use in preceding query
 set par(1)=pReq.Name
 set par(2)=pReq.SSN
 set par(3)=pReq.City

 //make sure to set top level of array,
 //which should indicate parameter count
 set par=3

 //perform the Insert
 set tSC = ..Adapter.ExecuteUpdateParmArray(.nrows,sql,.par)

 //create the response message
 set pResp=##class(ESQL.response1).%New()
 set pResp.AffectedRows=nrows

 if 'tSC write " failed ",tSC quit tSC
 quit 1
}

ストアド・プロシージャの実行

ストアド・プロシージャを実行するには、以下のメソッドのいずれかを使用します。

ExecuteProcedure()
Method ExecuteProcedure(ByRef pResultSnapshots As %ListOfObjects,
                Output pOutputParms As %ListOfDataTypes,
                pQueryStatement As %String,
                pIO As %String = "",
                pInputParms...) As %Status

ストアド・プロシージャを実行する SQL CALL 文を実行します。任意の数のパラメータを渡すことができます。注 :

  • 結果は、EnsLib.SQL.SnapshotOpens in a new tab オブジェクトのリストとして、最初の引数に参照渡しで返されます。

  • EnsLib.SQL.SnapshotOpens in a new tab の新しいインスタンスのリストを作成し、そのリストを最初の引数としてメソッドに渡すことができます。その場合は、メソッドがこれらのインスタンスを設定し、FirstRow プロパティと MaxRowsToGet プロパティの値を使用してそれぞれに相当する行のセットを選択します。次に、メソッドがインスタンスのリストを返します。

  • 2 番目の引数は、すべてのスカラ出力パラメータと入出力パラメータの出力値のリストです。プロシージャがスカラ戻り値を返し、文がそれを取得した場合は、この値が最初の出力値になります。

  • 3 番目の引数は、ストアド・プロシージャを実行する SQL CALL 文です。このクエリ文には、置き換え可能なパラメータを表す標準の SQL ? を使用できます。

    Important:

    ストアド・プロシージャ名では大文字と小文字が区別されます。また、SQL クエリが必要とする入力パラメータまたは入出力パラメータごとに、pQueryStatement 文で引数を指定する必要があります。

  • 4 番目 (オプション) の引数は、各パラメータのタイプ (入力、出力、または入出力) を示します。この引数を指定する場合は、文字 io、および b で構成される文字列を使用します。所定の位置にある文字が、対応するパラメータのタイプを示します。例えば、iob は、最初のパラメータが入力、2 番目のパラメータが出力、および 3 番目のパラメータが入出力であることを意味しています。

    Tip:

    デフォルトでは、アダプタは ODBC 関数 DescribeProcedureColumns を呼び出してパラメータに関する情報を取得し、この関数で返されたパラメータ・タイプとここに指定されているパラメータ・タイプが異なる場合は、警告をログに記録します。アダプタがこのチェックを実行しないようにするには、この文字列の最後にアスタリスク (*) を追加します。

    すべてのデータベースで、これらすべてのパラメータ・タイプがサポートされているわけではありません。接続しているデータベースでサポートされているタイプのみを使用してください。

ExecuteProcedureParmArray()
Method ExecuteProcedureParmArray(ByRef pResultSnapshots As %ListOfObjects,
                Output pOutputParms As %ListOfDataTypes,
                pQueryStatement As %String,
                pIO As %String = "",
                ByRef pIOParms) As %Status

ストアド・プロシージャを実行する SQL CALL 文を実行します。このメソッドは上記のメソッドと似ていますが、パラメータの指定方法が異なります。このメソッドの場合は、この章で前出の “Caché の多次元配列でのパラメータの指定” で説明したとおり、Caché の多次元配列 (pParms) にパラメータを指定します。

ExecuteProcedureParmArray() メソッドは、パラメータを指定する必要があるときに、使用している ODBC ドライバが ODBC SQLDescribeParam 関数をサポートしていない場合に使用します。

以下の点にも注意してください。

  • パラメータに関しては、pIOParms 配列内、および pIO 引数内で入出力タイプを指定した場合は、pIOParms 配列に指定されたタイプが優先されます。

  • pIOParms 配列内に入出力タイプを指定する場合は、すべての出力パラメータに対して、対応する配列ノードを未定義のままにします。

SQL アダプタが Java ゲートウェイを介して JDBC を使用するように構成している場合は、ラージ・オブジェクト値が格納されている出力パラメータはストリームとして返されます。旧バージョンの Ensemble との互換性を確保するために、グローバルがこれらのラージ・オブジェクト出力パラメータを文字列として返すように設定できます。ただし、このようにグローバルを設定した場合でも、そのオブジェクトが文字列の最大許容サイズを超えている場合は、ストリームとして返されます。この互換性動作を SQLservice 構成項目に対して設定するには、^Ens.Config("JDBC","LOBasString","SQLservice") というグローバルを 1 に設定します。

以下のコードは、出力パラメータ、入力パラメータ、およびもう 1 つ別の出力パラメータという 3 つのパラメータを持つストアド・プロシージャを実行します。入力パラメータは、要求メッセージ pReq.Parameters.GetAt(1)Parameters プロパティから抽出されます。出力パラメータは無視されます。

  Set tQuery="{ ?=call Sample.Employee_StoredProcTest(?,?) }"
  Set tSC = ..Adapter.ExecuteProcedure(.tRTs,.tOutParms,tQuery,"oio",pReq.Parameters.GetAt(1))
  Set tRes.ParametersOut = tOutParms

この例では、tRTs が以前作成された結果セットを表しています。

ステートメント属性の指定

SQL アダプタを使用する場合は、任意のドライバ依存のステートメント属性を指定できます。そのためには、以下のように操作します。

  • 接続が確立していない場合は、以下のような属性と値のペアのカンマ区切りリストの形式で、アダプタの StatementAttrs プロパティを設定します。

    attribute:value,attribute:value,attribute:value,...
    

    以後作成されるすべての文は、これらの属性を継承します。

    以下に例を示します。

    Set ..Adapter.StatementAttrs = "QueryTimeout:10"
    
  • 接続が既に確立している場合は、アダプタの SetConnectAttr() メソッドを呼び出します。このメソッドは、2 つの引数 (属性名および必要な値) を取り、ステータスを返します。以下に例を示します。

    Set tout= ..Adapter.SetConnectAttr("querytimeout",10)
    

    ネットワーク・エラーが検出された場合、デフォルトでは、アダプタは再接続と再試行を試みます。AutoCommit などの接続属性を設定している場合は、次の処理を行って、この再接続/再試行ロジックが実行されるようにしてください。つまり、SetConnectAttr() から返されたステータスをテストし、エラーが生じた場合は、そのステータス値をビジネス・オペレーションから返します。

Note:

使用する属性が、接続しているデータベースの ODBC ドライバでサポートされていることを確認してください。InterSystems のドキュメントには、これに関するリストは含まれていません。

ステートメント属性を設定するのに最も有効な場所は、以下のとおりです。

  • SQL 送信アダプタを使用する場合は、ビジネス・オペレーションのメッセージ・ハンドラ・メソッド内

  • ビジネス・ホストの OnInit() メソッド内

トランザクションの管理

SQL アダプタには、正式なデータベース・トランザクションの管理に使用できる以下のメソッドが用意されています。

SetAutoCommit()
Method SetAutoCommit(pAutoCommit) As %Status [ CodeMode = expression ]

このアダプタ接続の自動コミットをオンまたはオフに設定します。これは、DSN 接続の確立後にのみ機能します。

自動コミットを接続時点で設定する場合は、ビジネス・サービスまたはビジネス・オペレーションの OnInit() メソッドをカスタマイズします。カスタム・メソッドで、ConnectAttrs プロパティを設定します。

自動コミットを有効にする場合は、StayConnected を 0 に設定しないでください。この設定は、コマンドを処理している間、リモート・システムに接続したままにしておくかどうかを指定します。

ネットワーク・エラーが検出された場合、デフォルトでは、アダプタは再接続と再試行を試みます。AutoCommit などの接続属性を設定している場合は、次の処理を行って、この再接続/再試行ロジックが実行されるようにしてください。つまり、SetAutoCommit() から返されたステータスをテストし、エラーが生じた場合は、そのステータス値をビジネス・オペレーションから返します。

Commit()
Method Commit() As %Status

前回のコミット以降の (このアダプタ・プロセス内の) すべてのデータベース・アクティビティをコミットします。

Rollback()
Method Rollback() As %Status

前回のコミット以降の (このアダプタ・プロセス内の) すべてのデータベース・アクティビティ をロールバックします。

以下の例では、上記メソッドを使用する単純なトランザクションを示しています。

Method TransactionExample(pRequest As common.examples.msgRequest2,
  Output pResponse As common.examples.msgResponse) As %Status
{
  #Include %occStatus
  try {
    //initialize variables and objects
    set tSC = $$$OK
    set pResponse = ##class(common.examples.msgResponse).%New()

    #; start the transaction. Set autocommit to 0
    set tSC = ..Adapter.SetAutoCommit(0)
    $$$ThrowOnError(tSC)

    //Example UPDATE, INSERT, DELETE
    set tQueryIns="insert into common_examples.mytable(name,age,datetime)"
                _" values ('SAMPLE"_$random(9999)_"',40,'"_$zdt($h,3)_"')"

    set tSC = ..Adapter.ExecuteUpdate(.tAffectedRows,tQueryIns)
    $$$ThrowOnError(tSC)

    // finalize transaction
    set tSC=..Adapter.Commit()
    $$$ThrowOnError(tSC)

  }
  catch err{
    if (err.%ClassName(1)="common.err.exception") && ($$$ISERR(err.status)) {
      set tSC = err.status
    }
    else {
      set tSC =
      $system.Status.Error(err.Code,err.Name,err.Location,err.InnerException)
  }
    set pResponse.status = tSC
    do ..Adapter.Rollback()
  }
  Quit $$$OK
}
Note:

トランザクションを作成するデータベース・アクティビティを考慮することが重要です。これらのアクティビティが単一のビジネス・ホストに含まれている場合は、上記メソッドを使用してトランザクション管理を設定するだけですみます。ただし、データベース・アクティビティが複数のビジネス・ホストに含まれている場合は、コードを (通常はビジネス・プロセス内に) 記述して正しいロールバックをシミュレートする必要があります。

データベース接続の管理

アダプタのデータベース接続を管理するには、アダプタの以下のプロパティメソッドを使用できます。

プロパティ

以下のプロパティでは、データベース接続に関する情報を制御または提供します。

Connected

%BooleanOpens in a new tab

この読み取り専用プロパティは、アダプタが現在接続されているかどうかを示します。

ConnectAttrs

%StringOpens in a new tab

必要に応じて設定できる一連の SQL 接続属性オプション。ODBC の場合は、これらの形式は次のとおりです。

attr:val,attr:val

例 : AutoCommit:1

JDBC の場合は、これらの形式は次のとおりです。

attr=val;attr=val

例 : TransactionIsolationLevel=TRANSACTION_READ_COMMITTED

このプロパティをビジネス・オペレーションまたはビジネス・サービスの OnInit() メソッドで設定し、接続時にこのオプションを使用するように指定します。

ConnectTimeout

%NumericOpens in a new tab

このプロパティは、接続の試行ごとに待機する秒数を指定します。デフォルト値は 5 です。

StayConnected

%NumericOpens in a new tab

このプロパティは、リモート・システムに接続したままにしておくかどうかを指定します。

DSN

%StringOpens in a new tab

このデータ・ソース名は、接続先である外部データ・ソースを指定します。以下の例は、Microsoft Access データベースを参照する DSN の名前を示しています。

accessplayground

メソッド

データベース接続を管理するには、以下のメソッドを使用します。

Connect()
Method Connect(pTimeout As %Numeric = 30) As %Status

DSN プロパティの現在の値で指定されているデータ・ソースに接続します。

Disconnect()
Method Disconnect() As %Status

データ・ソースから切断します。

TestConnection()
Method TestConnection()

データ・ソースへの接続をテストします。

また、アダプタ・クラスにも、上記の節に記載されているプロパティの設定に使用できるセッター・メソッドがいくつか用意されています。

FeedbackOpens in a new tab