2.5.2 検索レコードの参照

ここでは,ResultSetに読込まれたレコードを参照する方法について説明します。参照目的で検索したレコードをアクセスする時には,カーソルを制御してカレントレコードを決定する必要がありますが,更新目的で検索した場合には,1レコードだけが読込まれますのでカーソルの制御は不要です。

<この項の構成>
(1) 参照目的レコードのカーソル制御
(2) フィールド値の参照・データ変換

(1) 参照目的レコードのカーソル制御

カーソルの移動には,次のメソッドを利用します。

ResultSetには,SetMaxRowsメソッドで設定したレコード数だけが格納され,これより多くのレコードが検索されている場合は,NextメソッドやPageNextメソッドを呼び出し,次のレコードをResultSetに読込むことが必要です。

レコードを先頭から順に参照する場合には,Nextメソッドだけを利用することにより,次のレコードが自動的にResultSetに読込まれます。

ResultSetに読込まれたレコードのカーソルを自由に移動するようなケースでは,次のレコードをResultSetに読込むために,一度Bottomメソッドで最後のレコードに位置付け,Nextで読込む方法もありますが,PageNextメソッドを使用することにより,カーソルの位置を意識せず,次のレコードをResultSetに読込むことができます。

カーソルの移動は,ResultSetに格納されたレコードだけに対して有効であり,前に読込まれたレコードに位置づけることはできません。

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

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

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

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

注意事項
  • Nullが格納されているフィールドに対してGetFieldメソッドを呼出すと取得データは意味のない値が戻されますので,Nullが格納される可能性があるフィールドに対してはIsFieldNullメソッドでフィールドの内容がNullでないことを確認してください。
  • 文字列から数値データ型への変換に失敗した場合には,0が返されます。指定したフィールドがなかった場合や値が変換できない場合は,エラーをスローします。
  • Executeメソッドで,TYPE_BLOB_FILEを指定した場合は,BLOB型のフィールドに対するGetFieldメソッドの引数にファイル名称が戻されます。この場合,GetFieldメソッドの引数の型には,文字列と同様に,LPTSTRを指定してください。