データを更新するには,前節で説明したResultSetを利用する方法と,SQLのUPDATE文を利用する方法とがあります。
ResultSetに検索されたレコードを更新するためには,カーソルをレコードに位置付け,Editメソッドで更新準備を指示します。この後,SetFieldメソッドでフィールドの内容を変更し,最後にUpdateメソッドで更新を指示します。複数のレコードを更新する場合には,この処理を繰り返す必要があります。
GetFieldメソッドの引数に指定したデータ型とデータベースのデータ型とが異なる場合は,データベースのデータ型に合わせて変換されます。データ型の変換規則は「7. データ型」を参照してください。
//////////////////////////////////////////////////////////////
/// SQLの実行(更新)
DBStatement* pStatement;
DBResultSet* pResultSet;
// DBStatementクラスの生成
pStatement = pConnect->CreateStatement();
// 更新可能なDBResultSetクラスを生成するために
// DBResultSetクラスのタイプを指定
pStatement->SetResultSetType(TYPE_EXCLUSIVE);
// SELECT文の設定
pStatement->Execute("SELECT F1, F2 FROM TABLE1");
// レコードの検索
pResultSet = pStatement->GetResultSet();
// レコードの読み込み
while(!pResultSet->IsEOF())
{
// フィールド"F2"のデータを更新
// ここでは,uFunc()というユーザ関数を使用
// LPCTSTR uFunc(void);
// 更新のためのEdit-SetField-Updateメソッド呼び出し
pResultSet->Edit();
pResultSet->SetField("F2", uFunc());
pResultSet->Update();
// Nextメソッドで次のレコードの読み込み
pResultSet->Next();
}
// その他の処理
.....
SQL文のUPDATE文を使って,データを更新できます。これは,既に更新するデータや内容が特定できる場合に,SQL文で直接,更新個所及び値を指定する方法です。この方法では,現在のデータを確認してから更新することはできません。
次に,DBStatementクラス及びDBConnectionクラスを使用して,?パラメタを使用しない更新をする場合と, DBPreparedStatementクラスを使用して,?パラメタを使用した更新をする場合の三通りについて説明します。
DBConnectionクラスのCreateStatementメソッドでDBStatementオブジェクトを生成します。次にDBStatementクラスのExecuteメソッドにSQL文を指定してメソッドを呼び出し,データを更新します。
//////////////////////////////////////////////////////////////
/// SQLの実行(更新) - DBStatementクラスでUPDATE文を指定
// DBStatementオブジェクトの生成
pStatement = pConnect->CreateStatement();
// SQL文の実行
pStatement->Execute("UPDATE TABLE1 SET F1=100 WHERE F2=300");
DBConnectionクラスのExecuteDirectメソッドでSQL文を実行してデータを追加します。
この方法は手順が簡単ですが,データをいったん検索してから更新したい場合は,DBStatementクラスを使用してください。DBConnectionクラスでは検索結果を受け取ることができないため,検索ができません。
//////////////////////////////////////////////////////////////
/// SQLの実行(更新) - DBConnectionクラスでUPDATE文を指定
// SQL文の実行
pConnect->ExecuteDirect("UPDATE TABLE1 SET F1=100
WHERE F2=300");
?パラメタを記述したUPDATE文を指定してDBConnectionクラスのCreatePreparedStatementメソッドを呼び出し,DBPreparedStatementオブジェクトを生成します。次に,ExecuteメソッドでSQL文をデータベースへ通知(解析)し,SetParamメソッドで?パラメタのデータを設定します。そして,ExecuteUpdateメソッドで更新を実行します。
//////////////////////////////////////////////////////////////
/// SQLの実行(更新)
///- DBPreparedStatementクラスで?パラメタのあるUPDATE文を指定
// DBPreparedStatementオブジェクトの生成
pStatement = pConnect->CreatePreparedStatement(
"UPDATE TABLE1 SET F1=? WHERE F2=?");
// SQL文の解析
pStatement -> Execute();
// ?パラメタへの値の設定
pStatement->SetParam(1,100);
pStatement->SetParam(2,300);
// 更新の実行
pStatement->ExecuteUpdate();
SetResultSetTypeメソッドで引数にTYPE_EXCLUSIVEを指定した場合,GetResultSetメソッドで更新できるResultSetが取得できます。ただし,次の場合には,SetResultSetTypeメソッドの引数にTYPE_EXCLUSIVEを指定するとExecuteメソッド実行時にエラーをスローします。
また,XDM/RDを使用している場合,検索結果にlong列(long mvarchar型,long nvarchar型, long varchar型)を含んでいると,そのフィールドに対しては,Updateメソッドを実行できません。