2.5.1 レコードの検索

レコードの検索には,DBRResultSetクラスのコンストラクタを利用して生成するResultSetオブジェクトのメソッドを使用します。

レコードの検索は,SELECT文をExecuteメソッドで通知し,Openメソッドで検索を実行します。検索したレコードは,このResultSetオブジェクトに格納されます。

レコードの検索には検索したレコードを参照だけする参照目的とレコードの更新または削除をする更新目的の2種類があり,この目的により検索するレコード数が異なります。

また,SELECT文の組み立てでは,SELECTの一部を実行時に置き換える,?パラメタの利用も可能です。

<この項の構成>
(1) 参照目的の検索
(2) 更新目的の検索
(3) ?パラメタを使用した検索

(1) 参照目的の検索

参照を目的とした検索では,Executeメソッドの引数swTypeにTYPE_NONEを指定する必要があります。レコードの検索は,Openメソッドを呼び出すことにより実行され,検索したレコードがResultSetに読込まれます。ResultSetに読込むレコード数は,SetMaxRowsメソッドで設定します。

検索条件に一致したレコードすべてを処理する場合はNextメソッドでカーソルを移動します。この場合,SetMaxRowsメソッドで設定したレコード数を越えてNextメソッドが要求されると,次のレコードが自動的にResultSetに読込まれます。

参照専用のResultSetに検索結果を読込む例を示します。

//////////////////////////////////////////////////////////////
/// SQLの実行(検索)  
DBRResultSet *pRs1;  
 pRs1 = new DBRResultSet(pDB1);                // オブジェクトの生成
   
 pRs1->SetMaxRows(10);                         // レコード数
 pRs1->Execute("SELECT F1, F2 FROM TABLE1",    // SELECT文の設定
                  TYPE_NONE);                  // 参照目的
 pRs1->Open();                                 // レコードの検索
 while(!pRs1->IsEOF())
 {                  
   .....
   pRs1->Next();
 }

(2) 更新目的の検索

更新を目的とした検索では,Executeメソッドの引数swTypeにTYPE_EXCLUSIVEを指定する必要があります。この場合,ResultSetには1レコードだけが読込まれます。

TYPE_EXCLUSIVEを指定した場合は,検索時のSELECT文でFOR UPDATEオプションは指定する必要はありません。

注意事項
更新目的の検索の場合,下記例に示すSELECT文を指定するとデータベースによりエラーとなります(Executeメソッド実行時にエラーがスローされる)。
  • 集合関数(avg, countなど)や組み込み関数を使用する場合
  • DISTINCTを使用する場合
  • GROUP BY句やUNION句を使用する場合
  • 演算子を含む場合(UNION, INTERSECT, MINUS)
  • JOINを含む場合
  • 上記に該当するVIEWを利用する場合

(3) ?パラメタを使用した検索

SELECT文の一部を実行時に置き換える?パラメタを利用する場合,Executeメソッドの引数で?パラメタ付きのSELECT文とします。?パラメタの値は,SetParamメソッドで指定します。レコードの検索は,Openメソッドを呼び出すことにより実行され,検索したレコードがResultSetに読込まれます。

?パラメタを使用した例を示します。

//////////////////////////////////////////////////////////////
/// ?パラメタを使用した検索
DBRResultSet *pRs1;  
 pRs1 = new DBRResultSet(pDB1);               // オブジェクトの生成
       
 pRs1->Execute("SELECT F1, F2 FROM TABLE1 ID > ? AND ID < ?",
                  TYPE_NONE);
 pRs1->SetParam(1,100);        // 1番目の?パラメタに対する値の設定
 pRs1->SetParam(2,300);        // 2番目の?パラメタに対する値の設定
 pRs1->Open();                 // レコードの検索