ここでは,ResultSetに読込まれたレコードを参照する方法について説明します。
ResultSetに複数の検索結果を得た場合,一つ一つのレコードを特定するために,カーソルを使用します。
ResultSetの中でカーソルを移動させるには,次のメソッドを呼び出します。
なお,1度にResultSetへ格納できるレコード数はSetMaxRowsメソッドで指定でき,これより多くのレコードを検索した場合は,複数回に分けてレコードを取得することになります。SetMaxRowsメソッドの値を超えたレコード数を参照するには,次に示すPageNextメソッドを利用します。
この他に,現在のレコード位置を知るためのメソッドがあります。
カーソルが,ResultSetのレコードの範囲を越えて指定された場合には,エラーがスローされます。アプリケーションでは,カーソルを移動する前後でIsEOFメソッドの戻り値を確認することで,ResultSetの範囲を確認できます。
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();
}
レコードの更新を目的として,データベースのレコードを参照するときには,SetResultSetTypeメソッドでResultSetの排他タイプをTYPE_EXCLUSIVEとします。これにより,GetResultSetで得るResultSetが更新可能になります。
更新可能なResultSetには,一度に一つのレコードしか読み込めません。次のレコードを読み込むには,Nextメソッドを使います。
なお,更新可能なDBResultSetオブジェクトを生成している場合は,検索時にSELECT文でFOR UPDATEオプションを指定する必要はありません。