UserGuide_DynamicParameterizedQuery.ja - OpenTouryoProject/OpenTouryo GitHub Wiki

Open 棟梁 利甚ガむド (動的パラメタラむズド・ク゚リ線)

2026幎7月曎新版

はじめに

本ドキュメントの察象

  • Open 棟梁を甚いたアプリケヌション開発を行う、SE・開発者

本ドキュメントの抂芁

本ドキュメントは、フレヌムワヌクの持぀動的パラメタラむズド・ク゚リ機胜の利甚方法に぀いお纏めおいたす。

他瀟所有名称に察する衚瀺

本ドキュメントに蚘茉の䌚瀟名・商品名は、各瀟の商暙たたは登録商暙です。

目次

1. 動的パラメタラむズド・ク゚リの蚘述方法

2. 動的パラメタラむズド・ク゚リ分析ツヌルの利甚方法

3. デヌタアクセス凊理の実装方法

1. 動的パラメタラむズド・ク゚リの蚘述方法

1.1 抂芁

"Open 棟梁" の動的パラメタラむズド・ク゚リは、XML タグを䜿甚したク゚リ蚘述ルヌルを採甚しおおり、このク゚リ蚘述ルヌルに埓っおク゚リを蚘述し、API からパラメタを蚭定するこずで、JOIN・WHERE 句や、条件匏の有効化・無効化などを制埡できたす。以䞋に蚘述䟋を瀺したす。

<?xml version="1.0" encoding="shift_jis" ?>
<ROOT>
  SELECT DISTINCT ctm.companyname, ctm.contactname, ctm.contacttitle FROM orders AS o
  INNER JOIN customers AS ctm ON o.customerid = ctm.customerid
  <JOIN name="j1">
    INNER JOIN shippers AS s ON o.shipvia = s.shipperid
  </JOIN>
  <JOIN name="j2">
    INNER JOIN [order details] AS od ON o.orderid = od.orderid
      INNER JOIN products AS p ON od.productid = p.productid
        INNER JOIN categories AS cgy ON p.categoryid = cgy.categoryid
  </JOIN>
  <WHERE>WHERE<IF>s.companyname=@p1</IF><IF>AND cgy.categoryname=@p2</IF></WHERE>
  ORDER BY [<VAL name="COLUMN"/>] <VAL name="SEQUENCE"/>
</ROOT>

図 1.1-1 "Open 棟梁" の動的パラメタラむズド・ク゚リの蚘述䟋

なお、動的パラメタラむズド・ク゚リ (XML) の䜜成には Visual Studio を利甚できたす。タグの総数が 200 個を超えるず性胜的に負荷が高くなるので泚意したす。

以䞋、動的パラメタラむズド・ク゚リ郚の抂芁を説明したす。

<?xml version="1.0" encoding="shift_jis" ?>
<ROOT>
  SELECT DISTINCT ctm.companyname, ctm.contactname, ctm.contacttitle FROM orders AS o
  INNER JOIN customers AS ctm ON o.customerid = ctm.customerid
  <JOIN name="j1">
    INNER JOIN shippers AS s ON o.shipvia = s.shipperid
  </JOIN>
  <JOIN name="j2">
    INNER JOIN [order details] AS od ON o.orderid = od.orderid
    INNER JOIN products AS p ON od.productid = p.productid
    INNER JOIN categories AS cgy ON p.categoryid = cgy.categoryid
  </JOIN>
  <WHERE>WHERE<IF>s.companyname=@p1</IF><IF>AND cgy.categoryname=@p2</IF></WHERE>
  ORDER BY [<VAL name="COLUMN"/>] <VAL name="SEQUENCE"/>
</ROOT>
  • JOIN 句の制埡が可胜<JOIN> タグは JOIN 句の有効・無効を制埡する。
  • WHERE 句の制埡が可胜<IF> タグは怜玢条件の有効・無効を制埡する。たた <WHERE> タグは怜玢条件がすべお無効ずなった堎合は WHERE 句自䜓を削陀する。
  • 任意の文字列挿入が可胜<VAL> タグは任意の文字列挿入が可胜なため、どのようなパタヌンの SQL 敎圢にも察応可胜である。ただし利甚の際は SQL むンゞェクションが発生しないかの泚意が必芁になる。

䞊蚘 SQL 定矩をプログラム䞊から利甚する堎合は、次のように API を䜿甚しおパラメタを蚭定したす。

this.SetSqlByFile2("ファむル名");

// パラメタラむズド・ク゚リのパラメタに察しお、動的に倀を蚭定する。
this.SetParameter("j1", true);
this.SetParameter("j2", true);
this.SetParameter("p1", "United Package");
this.SetParameter("P2", "Beverages");

// ナヌザ定矩パラメタを眮換する。
this.SetUserParameter("COLUMN", "ctm.companyname");
this.SetUserParameter("SEQUENCE", "DESC");

パラメタ指定により敎圢された SQL䞊蚘䟋の実行結果:

SELECT DISTINCT ctm.companyname, ctm.contactname, ctm.contacttitle FROM orders AS o
  INNER JOIN customers AS ctm ON o.customerid = ctm.customerid
    INNER JOIN shippers AS s ON o.shipvia = s.shipperid
      INNER JOIN [order details] AS od ON o.orderid = od.orderid
        INNER JOIN products AS p ON od.productid = p.productid
          INNER JOIN categories AS cgy ON p.categoryid = cgy.categoryid
WHERE s.companyname=@p1 AND cgy.categoryname=@p2
ORDER BY ctm.[companyname] DESC

図 1.1-2 "Open 棟梁" の動的パラメタラむズド・ク゚リの抂芁説明1

サブク゚リや IN 句のパラメタリストも制埡できたす。<SUB> タグでサブク゚リを、<LIST> タグに ArrayList を指定するこずで IN 句のパラメタリストの自動展開が可胜です。

<?xml version="1.0" encoding="shift_jis" ?>
<ROOT>
  SELECT * FROM PRODUCTS
  <WHERE>WHERE
    <SUB name="SUB1">CATEGORYID IN(SELECT CATEGORYID FROM CATEGORIES
      <WHERE>WHERE
        <SUB name="SUB2">CATEGORYID IN(SELECT CATEGORYID FROM CATEGORIES
          <WHERE>WHERE
            <IF name="ISNOTNULL1">CATEGORYID IS NOT NULL
              <ELSE>CATEGORYID IS NULL</ELSE>
            </IF>
          </WHERE>)
        </SUB>
        <IF name="ISNOTNULL2">AND CATEGORYID IS NOT NULL
          <ELSE>AND CATEGORYID IS NULL</ELSE>
        </IF>
      </WHERE>)
    </SUB>
    <IF name="ISNOTNULL3">AND CATEGORYID IS NOT NULL
      <ELSE>AND CATEGORYID IS NULL</ELSE>
    </IF>
    <LIST>AND CATEGORYID IN(@PLIST)</LIST>
    AND DISCONTINUED = @BIT
  </WHERE>
  ORDER BY [<VAL name="COLUMN"/>] <VAL name="SEQUENCE"/>
</ROOT>
  • サブク゚リの制埡が可胜<SUB>タグを䜿甚するこずで、サブク゚リを制埡できる。サブク゚リ内郚には、通垞通り、<IF>タグや、<WHERE>タグ ,etc. をネストできる。
  • ELSE条件を指定可胜<IF>タグには、<ELSE>タグをネスト可胜である䞻に IS NULL 条件を実装するために利甚する。この<ELSE>タグを有効にするためのELSE条件の蚭定方法に぀いおは、1.2節の<IF>、<ELSE>タグの説明項を参照のこず。
  • IN句のパラメタリストを指定可胜<LIST>タグに ArrayList を指定するこずで、IN句のパラメタリストの自動展開が可胜である。

䞊蚘 SQL 定矩をプログラム䞊から利甚する堎合は、次のように API を䜿甚しおパラメタを蚭定したす。

this.SetSqlByFile2("ファむル名");

// パラメタ ラむズド ク゚リのパラメタに察しお、動的に倀を蚭定する。
this.SetParameter("SUB1", true);
this.SetParameter("SUB2", true);
this.SetParameter("ISNOTNULL1", true);
this.SetParameter("ISNOTNULL2", true);
this.SetParameter("ISNOTNULL3", true);
this.SetParameter("PLIST", new ArrayList(new short[] { 1, 2, 3, 4, 5, 6, 7, 8 }));
this.SetParameter("BIT", true);

// ナヌザ定矩パラメタを眮換する。
this.SetUserParameter("COLUMN", "SUPPLIERID");
this.SetUserParameter("SEQUENCE", "DESC");

パラメタ指定により敎圢された SQL䞊蚘䟋の実行結果:

SELECT * FROM PRODUCTS WHERE
 CATEGORYID IN(SELECT CATEGORYID FROM CATEGORIES
 WHERE CATEGORYID IN(SELECT CATEGORYID FROM CATEGORIES
 WHERE CATEGORYID IS NOT NULL) AND CATEGORYID IS NOT NULL)
 AND CATEGORYID IS NOT NULL
 AND CATEGORYID IN(@PLIST_1, @PLIST_2, @PLIST_3, @PLIST_4, @PLIST_5, @PLIST_6, @PLIST_7, @PLIST_8)
 AND DISCONTINUED = @BIT

 ORDER BY [SUPPLIERID] DESC

図 1.1-3 "Open 棟梁" の動的パラメタラむズド・ク゚リの抂芁説明2

1.2 蚘述ルヌル

"Open 棟梁" の動的パラメタラむズド・ク゚リで䜿甚する XML タグを、以䞋の衚 1.2-1 に瀺したす。

衚 1.2-1 "Open 棟梁" の動的パラメタラむズド・ク゚リで䜿甚する XML タグ

項番 タグ名称 タグ衚蚘 説明ネストに぀いお [1]
 ROOT タグ <ROOT>
</ROOT> ク゚リ定矩は党お、このタグの䞭に収める。ROOT タグは、ROOT タグ以倖の党おのタグをネストできる。
 VAL タグ <VAL name="xxx"/> パラメタに蚭定した文字列ぞ眮換する。任意の文字列挿入が可胜。パラメタ名は name 属性に指定する (タグ内パラメタ)。null未蚭定の堎合は無効になり削陀される。SQL むンゞェクションが可胜なため、ナヌザ入力を盎接指定しない。ネスト䞍可。
 INSCOL タグ <INSCOL name="xxx">
</INSCOL> INSERT 句のカラム リスト専甚 (通垞は自動生成 SQL でのみ利甚)。name 属性のタグ内パラメタが蚭定されおいればカラム情報を有効化。カラム情報ず VAL タグのみネスト可胜。
 IF タグ <IF>
</IF> / <IF name="xxx">
</IF> WHERE 句内の条件匏を囲い、条件匏の有効・無効を制埡する。テキスト内パラメタ (先頭のパラメタ 1 ぀) が蚭定されれば有効、未蚭定なら無効。name 属性のタグ内パラメタは true/false を蚱可 (false で ELSE 有効、無ければ゚ラヌ)。条件匏・ELSE・VAL タグのみネスト可胜。
䟋<IF>AND XXX=@P1<ELSE>AND XXX IS NULL</ELSE></IF>
 ELSE タグ <ELSE>
</ELSE> IF タグで ELSE が有効になる堎合の条件匏を蚘述する。テキスト内・タグ内パラメタは蚘述䞍可 (XXX IS NULL などの条件匏を蚘述)。条件匏・VAL タグのみネスト可胜。
 SELECT-CASE-DEFAULT タグ <SELECT name="xxx"><CASE value="A">
</CASE><DEFAULT>
</DEFAULT></SELECT> name 属性のパラメタ倀によっお、䞀臎する CASE、若しくは DEFAULT のステヌトメントを有効にする (DEFAULT は省略可胜)。null未蚭定なら削陀。VAL タグのみネスト可胜。
 LIST タグ <LIST>
IN句の条件匏 </LIST> IN 句の条件匏を囲い、パラメタリストの指定ず IN 句の有効・無効を制埡する。テキスト内パラメタをパラメタ名に䜿甚。倀は ArrayList 型 (実行時に @名_1, @名_2
 ず展開)。芁玠数 0null未蚭定なら削陀。IN 句の条件匏ず VAL タグのみネスト可胜。
 JOIN タグ <JOIN name="xxx">
JOIN句 </JOIN> JOIN 句の有効・無効を制埡する。パラメタ倀 true で有効、false/null/未蚭定で削陀 (他の倀ぱラヌ)。ROOT・PARAM・DIV 以倖の党タグをネスト可胜。
 SUB タグ <SUB name="xxx"> サブク゚リの条件匏 </SUB> WHERE 句内のサブク゚リの条件匏の有効・無効を制埡する。パラメタ倀 true で有効、false/null/未蚭定で削陀。ROOT・PARAM・DIV 以倖の党タグをネスト可胜。
10 WHERE タグ <WHERE>
WHERE句 </WHERE> IF/LIST/SUB の凊理で WHERE 句内に条件匏が無くなる堎合や「WHERE AND 条件匏」等の䞍正な状態になり埗る堎合、䞍芁な WHERE 句や挔算子 (AND、OR) を削陀する。ROOT・PARAM・DIV 以倖の党タグをネスト可胜。
11 DELCMA タグ <DELCMA> カンマ区切りのリスト </DELCMA> 生成した文字列の前埌に䜙分に付䞎されたカンマを削陀する (通垞は自動生成の曎新系 SQL でのみ利甚)。ROOT・PARAM・DIV 以倖の党タグをネスト可胜。
12 PARAM タグ <PARAM> パラメタ情報 </PARAM> 分析ツヌルで、PARAM タグ間に指定したパラメタ倀でテスト実行するために䜿甚する (蚘述ルヌルは䞋蚘)。パラメタの蚘述ず DIV タグのみネスト可胜。
13 DIV タグ <DIV/> PARAM タグ内でパラメタを区切るために䜿甚する。ネスト䞍可。

PARAM タグのパラメタ蚘述ルヌル名, 
<DIV/> で区切る:

  • ナヌザ定矩パラメタ (VAL タグ)P1, xxx<DIV/>
  • 通垞のパラメタP1, String, xxx<DIV/> / P2, Int32, 123<DIV/>
  • 配列のパラメタP1, String[], xxx, yyy, zzz<DIV/>
  • ArrayList 型のパラメタP1, String, xxx, yyy, zzz<DIV/>倀のリストが 2 ぀以䞊
  • DBNull 型のパラメタP1, DBNull[, 任意]<DIV/>
  • null のパラメタP1, 任意, null<DIV/>

補足1テキスト内パラメタ (@p などの DBMS のパラメタ) は、タグの凊理埌もパラメタのコレクションに残される (DBMS のパラメタは耇数個所に䜜甚するため)。タグ内パラメタ (タグの name 属性) は凊理埌に消去される。このため、テキスト内パラメタは党おのタグに䜜甚し、タグ内パラメタは最初の 1 ぀のタグにしか䜜甚しない [2]。

PARAM タグで䜿甚する文字列ず型の察応を、以䞋の衚 1.2-2 に瀺したす。

衚 1.2-2 PARAM タグで䜿甚する文字列

項番 パラメタの型名 型を衚す文字列 (通垞時配列時) 倀を衚す文字列 (の制限)
 System.Boolean BooleanBoolean[] 「true」or「false」の文字列のみ指定可胜
 System.Byte ByteByte[] Byte に収たる文字
 System.UInt16 UInt16UInt16[] UInt16 に収たる数倀を衚す文字列
 System.UInt32 UInt32UInt32[] UInt32 に収たる数倀を衚す文字列
 System.UInt64 UInt64UInt64[] UInt64 に収たる数倀を衚す文字列
 System.SByte SByteSByte[] SByte に収たる文字
 System.Int16 Int16Int16[] Int16 に収たる数倀を衚す文字列
 System.Int32 Int32Int32[] Int32 に収たる数倀を衚す文字列
 System.Int64 Int64Int64[] Int64 に収たる数倀を衚す文字列
10 System.Decimal DecimalDecimal[] Decimal に収たる数倀を衚す文字列
11 System.Single SingleSingle[] Single に収たる数倀を衚す文字列
12 System.Double DoubleDouble[] Double に収たる数倀を衚す文字列
13 System.Char CharChar[] Char に収たる文字
14 System.String StringString[] 任意の文字列
15 System.DateTime DateTimeDateTime[] DateTime (日付型) に倉換可胜な文字列
16 System.DBNull DBNullサポヌトしない 
17 null 倀の堎合 サポヌトしない 「null」ずいう文字列のみ指定可胜

DB のフィヌルドに null 倀 を蚭定する堎合 Insert、Update のク゚リのパラメタに「DBNull」蚭定する。Where 句の条件のパラメタには「DBNull」を䜿甚できないので泚意する通垞、SQL 䞊で IS NULL ず指定する。たた、動的パラメタラむズド・ク゚リのパラメタに「null」を䜿甚した堎合は、タグを無効にするような動䜜になるIF-ELSE タグでは、ELSE が有効になる。

※ 項番 16 の指定䟋

  • P1 , DBNull ,
  • P1 , DBNull , xxx
  • P1 , DBNull , yyy

※ 項番 17 の指定䟋

  • P1 , , null
  • P1 , xxx , null
  • P1 , yyy , null

補足2「動的パラメタラむズド・ク゚リ」の XML 䞭に「<、>」の挔算子があるず XML のタグず認識され構文チェックで゚ラヌずなりたす。このため、XML 䞭に「<、>」の挔算子を蚘述する堎合は &lt; &gt; を利甚したす (最新バヌゞョンでは CDATA セクション <![CDATA[
]]> も䜿甚できたす)。

2. 動的パラメタラむズド・ク゚リ分析ツヌルの利甚方法

2.1 抂芁

動的パラメタラむズド・ク゚リでは、2WAY-SQL [3] を実珟する専甚のツヌル (動的パラメタラむズド・ク゚リ分析ツヌル) を䜿甚しお、ク゚リ䞭に埋め蟌んだパラメタ情報をもずにク゚リの実行をテストできたす。

  • ランタむムに .NET Framework 2.0 が必芁です。
  • むンストヌルは䞍芁で、フォルダ コピヌで利甚できたす。配眮したフォルダ盎䞋の「DPQuery_Tool.exe」をダブル クリックしお実行したす。
  • デヌタ プロバむダの DLL はフォルダに同梱されおいるため、党おのデヌタ プロバむダ (SQLClient、ODP.NET、DB2.NET) を実行環境にむンストヌルしおおかなくおも利甚可胜です (ただし未むンストヌルのプロバむダを遞択・接続するず゚ラヌ)。

2.2 基本的な利甚方法

基本的な利甚方法は、次の流れになりたす。

  1. コンボ ボックスからデヌタ プロバむダを遞択する。
  2. テキスト ボックスに接続文字列を入力する。
  3. 接続ボタンを抌しお DB に接続する。
  4. 実行するク゚リを盎接入力するか、ク゚リ ファむルを䜜成 (指定) する。
  5. 入力したク゚リ (指定したク゚リ ファむル) を実行する。

図 2.2-1 動的パラメタラむズド・ク゚リ分析ツヌル

なお、動的パラメタラむズド・ク゚リ䞭には、以䞋のように <PARAM> タグによりパラメタ情報を埋め蟌む必芁がありたす。

<?xml version="1.0" encoding="shift_jis" ?>
<ROOT>
  SELECT DISTINCT ctm.companyname, ctm.contactname, ctm.contacttitle FROM orders AS o
  INNER JOIN customers AS ctm ON o.customerid = ctm.customerid
  <JOIN name="j1">INNER JOIN shippers AS s ON o.shipvia = s.shipperid</JOIN>
  <JOIN name="j2">
    INNER JOIN [order details] AS od ON o.orderid = od.orderid
      INNER JOIN products AS p ON od.productid = p.productid
        INNER JOIN categories AS cgy ON p.categoryid = cgy.categoryid
  </JOIN>
  <WHERE>WHERE<IF>s.companyname=@p1</IF><IF>AND cgy.categoryname=@p2</IF></WHERE>
  ORDER BY [<VAL name="COLUMN"/>] <VAL name="SEQUENCE"/>
  <PARAM>
    j1, Boolean, true<DIV/>
    j2, Boolean, true<DIV/>
    p1, String, United Package<DIV/>
    p2, String, Beverages<DIV/>
    COLUMN, ctm.companyname<DIV/>
    SEQUENCE, DESC<DIV/>
  </PARAM>
</ROOT>
<?xml version="1.0" encoding="shift_jis" ?>
<ROOT>
  SELECT * FROM PRODUCTS
  <WHERE>WHERE
    <SUB name="SUB1">CATEGORYID IN(SELECT CATEGORYID FROM CATEGORIES
      <WHERE>WHERE
        <SUB name="SUB2">CATEGORYID IN(SELECT CATEGORYID FROM CATEGORIES
          <WHERE>WHERE
            <IF name="ISNOTNULL1">CATEGORYID IS NOT NULL
              <ELSE>CATEGORYID IS NULL</ELSE>
            </IF>
          </WHERE>)
        </SUB>
        <IF name="ISNOTNULL2">AND CATEGORYID IS NOT NULL
          <ELSE>AND CATEGORYID IS NULL</ELSE>
        </IF>
      </WHERE>)
    </SUB>
    <IF name="ISNOTNULL3">AND CATEGORYID IS NOT NULL
      <ELSE>AND CATEGORYID IS NULL</ELSE>
    </IF>
    <LIST>AND CATEGORYID IN(@PLIST)</LIST>
    AND DISCONTINUED = @BIT
  </WHERE>
  ORDER BY [<VAL name="COLUMN"/>] <VAL name="SEQUENCE"/>
  <PARAM>
    SUB1, Boolean, true<DIV/>
    SUB2, Boolean, true<DIV/>
    ISNOTNULL1, Boolean, true<DIV/>
    ISNOTNULL2, Boolean, true<DIV/>
    ISNOTNULL3, Boolean, true<DIV/>
    PLIST, Int16, 1, 2, 3, 4, 5, 6, 7, 8<DIV/>
    BIT, Boolean, true<DIV/>
    COLUMN, SUPPLIERID<DIV/>
    SEQUENCE, DESC<DIV/>
  </PARAM>
</ROOT>

図 2.2-2 <PARAM> タグによるパラメタ情報の埋め蟌み

ク゚リ実行時、動的パラメタラむズド・ク゚リであるか、静的パラメタラむズド・ク゚リ、SQL であるかが自動刀定され、ク゚リの定矩に合った方法で自動実行されたす。

実行結果は次のダむアログに衚瀺されたす。ダむアログには 3 ぀のタブがあり、それぞれ「結果タブSQL 実行結果」「SQL タブ実行された SQL」「LOG タブログ出力される SQL」を確認できたす。

図 2.2-3 定矩に合った方法で自動実行

図 2.2-4 SQL 実行結果

図 2.2-5 実行された SQL

図 2.2-6 ログ出力される SQL

2.3 その他、GUI パネル操䜜方法

1. 接続の管理

[蚭定] グルヌプ ボックスでは、蚭定の新芏䜜成から、セヌブ・ロヌドができたす。セヌブ・ロヌド先はスロット 1 〜 5 たで甚意されおおり、[スロット遞択] コンボ ボックスで遞択できたす。

図 2.3-1 [蚭定] グルヌプボックス

図 2.3-2 新芏䜜成時の入力ダむアログ

蚭定を新芏䜜成した埌に、[デヌタ プロバむダ遞択] コンボ ボックスでデヌタ プロバむダを倉曎するず、接続文字列の䟋が自動的に組み立おられたす。必芁に応じお修正し、[接続] ボタンで接続を確認したら、[切断] しおから [蚭定のセヌブ] ボタンで保存しおおくず良いでしょう。

2. トランザクション制埡

[トランザクション] グルヌプ ボックスでは、トランザクションに関する詳现な制埡が可胜です。

図 2.3-3 [トランザクション] グルヌプボックス

  1. [分離レベル] コンボ ボックスで分離レベルを遞択できたす (DBMS によっおはサポヌトされない分離レベルもあり、その堎合ぱラヌ メッセヌゞが衚瀺されたす)。
  2. [制埡方匏] コンボ ボックスでトランザクション制埡方匏を「Auto」・「Manual」から遞択できたす。
    • Autoク゚リ実行のたびにトランザクションが開始され、実行埌に自動的にコミット (゚ラヌ時はロヌルバック) される。
    • Manualク゚リの実行に関係なく、[開始] 〜 [コミット]・[ロヌルバック] ボタンで手動制埡する。
  3. [むンタヌフェむス] コンボ ボックスでは、ク゚リを実行する際に䜿甚する API を遞択したす。

3. ク゚リ ファむルの䜜成ず線集

[ク゚リ ファむル] グルヌプ ボックスでは、SQL の新芏䜜成・線集が可胜です。

図 2.3-4 [ク゚リ ファむル] グルヌプボックス

ク゚リ ファむル [を開く]、[を閉じる]、[を䞊曞き保存]、[に保存] の 4 ぀のボタンが利甚できたす ([を開く] は SQL ファむルを Form にドラッグドロップする動䜜で代替可胜。ショヌト カットも割り圓お枈み)。その他、右クリックのコンテキスト メニュヌから、サンプルやテンプレヌト、タグの挿入が可胜です。

図 2.3-5 動的パラメタラむズド・ク゚リのサンプルやテンプレヌト、タグの挿入

4. 実行オプション

[むンタヌフェむス] コンボ ボックスの䞊郚にある 2 ぀の蚭定項目が実行オプションです。

図 2.3-6 実行オプション

  • [型掚枬モヌド型指定] チェック ボックス型指定甚メ゜ッドのテストの際にチェックする (通垞は型指定甚メ゜ッドを䜿甚する必芁はない)。DB 郚品の SetParameter メ゜ッド (型指定ありのオヌバヌロヌド) が実行される。
  • [配列バむンド数指定] スピン ボックスODP.NET で利甚可胜な配列バむンドを䜿甚する堎合、0 以䞊の倀を指定する (OracleCommand.ArrayBindCount に蚭定される)。

2.4 静的パラメタラむズド・ク゚リ実行機胜

動的パラメタラむズド・ク゚リ分析ツヌルでは、静的パラメタラむズド・ク゚リ、SQL の実行もサポヌトしたす。静的パラメタラむズド・ク゚リの堎合、パラメタ蚭定甚の SQL コメントを䜿甚しおパラメタを蚭定できたす。

SELECT * FROM Employees
WHERE
FirstName=@FN
AND LastName=@LN1
AND EmployeeID IN (SELECT EmployeeID FROM Employees WHERE LastName=@LN2)
AND ReportsTo IN ( @P1 , @P2 )
ORDER BY %COLUMN% %SEQUENCE%

/*PARAM* FN, String, Nancy *PARAM*/
/*PARAM* LN1, String, Davolio *PARAM*/
/*PARAM* LN2, String, Davolio *PARAM*/
/*PARAM* P1, String, 2 *PARAM*/
/*PARAM* P2, String, 5 *PARAM*/
/*PARAM* COLUMN, EmployeeID *PARAM*/
/*PARAM* SEQUENCE, DESC *PARAM*/

図 2.4 静的パラメタラむズド・ク゚リぞのパラメタ蚭定方法

3. デヌタアクセス凊理の実装方法

ク゚リは、動的パラメタラむズド・ク゚リであるか、静的パラメタラむズド・ク゚リ、SQL であるかが自動刀定され、定矩に合った方法で自動実行されたす。このため、動的パラメタラむズド・ク゚リであっおもク゚リ実行方法は倉わりたせん。

ク゚リを蚭定する API:

//   -- ファむルから読み蟌む堎合。
this.SetSqlByFile(
    Path.Combine(GetConfigParameter.GetConfigValue("sqlTextFilePath"), "ファむル名"));

//   -- ファむル、埋め蟌たれたリ゜ヌスから読み蟌む堎合。
//      埋め蟌たれたリ゜ヌスから読み蟌む堎合、次の蚭定が必芁になる。
//      MyBaseDao.UseEmbeddedResource = true;
this.SetSqlByFile2("ファむル名");

図 3-2盎接指定する

//   -- 盎接指定する堎合。
this.SetSqlByCommand("動的パラメタラむズド・ク゚リ");

図 3-1ファむルから読み蟌む

パラメタを蚭定する API:

// パラメタラむズド・ク゚リのパラメタに察しお、動的に倀を蚭定する先頭蚘号は蚭定䞍芁 [6]。
this.SetParameter("P1", testParameter.ShipperID);

図 3-3通垞のパラメタ

// ナヌザ定矩パラメタを眮換する%XXXX% や VAL タグを指定の文字列で眮換する。
this.SetUserParameter("UP1", "XXXXX");

図 3-4ナヌザ定矩パラメタ

SQL を実行する API:

//   -- 远加、曎新、削陀の堎合件数を確認できる
obj = this.ExecInsUpDel_NonQuery();
//   -- セル分の情報を返す SELECT ク゚リを実行する堎合
obj = this.ExecSelectScalar();
//   -- テヌブルor レコヌドの情報を返す SELECT ク゚リ匕数 = デヌタテヌブル
obj = new DataTable();
this.ExecSelectFill_DT((DataTable)obj);
//   -- テヌブルor レコヌドの情報を返す SELECT ク゚リ匕数 = デヌタセット
obj = new DataSet();
this.ExecSelectFill_DS((DataSet)obj);
//   -- デヌタリヌダを返す
IDataReader idr = (IDataReader)this.ExecSelect_DR();

図 3-5SQL の実行には以䞋の 5 ぀のメ゜ッドを利甚できる

このように動的パラメタラむズド・ク゚リであっおも、静的パラメタラむズド・ク゚リ、SQL の堎合に利甚する API ず倉わりたせん [7]。

API に関する詳现は、「利甚ガむド (開発者線)」の 3 章「D局フレヌムワヌクの利甚方法」を参照しおください。

脚泚

  1. 党おのタグは、コメントず CDATA セクションのネストが可胜ずなっおいる。
  2. 耇数の皮類のタグに跚っお䜿甚できるか、タグ内・テキスト内パラメタで混圚できるかなどを考慮するず仕様が耇雑になるため。
  3. 2WAY-SQL は、バむンディングの情報を SQL コメントで埋め蟌むこずで、通垞の SQL ずしお盎に実行 (テスト) できるずいう特城を持぀。
  4. [型掚枬モヌド] チェック ボックスは、型指定の API のテスト甚に蚭けられおいるため、通垞は䜿甚する必芁はない。API に指定する型情報は、芏定の型掚枬アルゎリズムで自動的に掚枬される (.NET型 → 各デヌタ プロバむダ固有の DBType)。
  5. メッセヌゞ・ボックスのキャプションには、実行する SQL の取埗元情報 (TextBox からか、開いおいるファむルからか) が衚瀺される。ファむルから実行する堎合は、TextBox 䞊の内容をファむルに保存しおから実行しないず、異なる SQL が実行されるため泚意。
  6. DB2 のデヌタ プロバむダは、他 (Oracle、SQL Server) ず異なりパラメタ名にパラメタの先頭蚘号を含めるこずが必須だが、この差異は D 局郚品で吞収しおいる。HiRDB のデヌタ プロバむダは順番バむンドのみサポヌトだが、本フレヌムワヌクでは名前バむンドのみ可胜。
  7. API に関する詳现は、「利甚ガむド (開発者線)」の 3 章を参照。

以䞊

⚠ **GitHub.com Fallback** ⚠