2.6.2 検索レコードの参照

ここでは,ResultSetに読込まれたレコードを参照する方法について説明します。

<この項の構成>
(1) カーソルの移動
(2) フィールド値の参照・データ変換
(3) 更新のための参照をする場合

(1) カーソルの移動

ResultSetに複数の検索結果を得た場合,一つ一つのレコードを特定するために,カーソルを使用します。

ResultSetの中でカーソルを移動させるには,次のメソッドを呼び出します。

なお,1度にResultSetへ格納できるレコード数はSetMaxRowsメソッドで指定でき,これより多くのレコードを検索した場合は,複数回に分けてレコードを取得することになります。SetMaxRowsメソッドの値を超えたレコード数を参照するには,次に示すPageNextメソッドを利用します。

この他に,現在のレコード位置を知るためのメソッドがあります。

カーソルが,ResultSetのレコードの範囲を越えて指定された場合には,エラーがスローされます。アプリケーションでは,カーソルを移動する前後でIsEOFメソッドの戻り値を確認することで,ResultSetの範囲を確認できます。

(2) フィールド値の参照・データ変換

ResultSetのレコードのフィールド値は,DBResultSetクラスのGetFieldメソッドを使って参照します。データベースのデータ型とGetFieldメソッドの引数に指定したデータ型とが異なる場合は,引数のデータ型に合わせて変換されます。

文字列から数値データ型への変換に失敗した場合には,0が返されます。指定したフィールドがなかった場合や値が変換できない場合は,エラーをスローします。データ型の変換規則については,「7. データ型」を参照してください。

SetResultSetTypeメソッドで,TYPE_BLOB_FILEを指定した場合は,BLOB型のフィールドに対するGetFieldメソッドの引数にファイル名称が戻されます。この場合,GetFieldメソッドの引数の型には,文字列と同様に,LPTSTRを指定してください。

//////////////////////////////////////////////////////////////
// 値の参照の例
LPTSTR          pField;
INT32           nField;
      //データベースのデータの検索処理
                  :
                  :
      // 検索結果をResultSetに取得
      // レコードの読み込み
  while(!pResultSet->IsEOF())
  {
      // フィールドのデータの文字列変換と「ポインタ」の受け取り
          pResultSet->GetField(1, &nField);
          cout << "  Data=" << nField;
          pResultSet->GetField(2, &pField);
          cout << "  Data=" << pField;
      cout << endl;
      // 次のレコードの読み込み
      pResultSet->Next();
  }

(3) 更新のための参照をする場合

レコードの更新を目的として,データベースのレコードを参照するときには,SetResultSetTypeメソッドでResultSetの排他タイプをTYPE_EXCLUSIVEとします。これにより,GetResultSetで得るResultSetが更新可能になります。

更新可能なResultSetには,一度に一つのレコードしか読み込めません。次のレコードを読み込むには,Nextメソッドを使います。

なお,更新可能なDBResultSetオブジェクトを生成している場合は,検索時にSELECT文でFOR UPDATEオプションを指定する必要はありません。