2.5.3 レコードの更新

レコードを更新するには,検索したレコードを更新する方法(ResultSetを利用)と,UPDATE文で直接更新する方法とがあります。

データの更新が完了した後でCommitメソッドを発行してデータベースの更新情報を確定させる必要があります。

<この項の構成>
(1) 検索したレコードの更新
(2) UPDATE文を利用した更新

(1) 検索したレコードの更新

レコードを検索し更新するためには,更新目的でレコードを検索する必要があります。検索されたレコードはResultSetに1レコードだけ格納され,このレコードを更新するには,Editメソッドで更新準備を指示し,SetFieldメソッドでフィールドの内容を変更し,Updateメソッドで更新を指示します。複数のレコードを処理する場合には,Nextメソッドで次のレコードを読込み,この処理を繰り返す必要があります。

SetFieldメソッドの引数に指定したデータ型とデータベースのデータ型とが異なる場合は,データベースのデータ型に合わせて変換されます。データ型の変換規則は「7. データ型」を参照してください。

//////////////////////////////////////////////////////////////
/// SQLの実行(更新)
DBRResultSet *pRs1;  
 pRs1 = new DBRResultSet(pDB1);               // オブジェクトの生成

  // 更新目的で検索
 pRs1->Execute("SELECT F1, F2 FROM TABLE1", TYPE_EXCLUSIVE);
     
 pRs1->Open();                     // レコードの検索
 while(!pRs1->IsEOF())
 {
   // フィールド"F2"のデータを更新。uFunc()というユーザ関数を使用
   pRs1->Edit();
   pRs1->SetField("F2", uFunc());
   pRs1->Update();
   
   pRs1->Next();                   // 次のレコードの読み込み
 }
 pDB1->Commit();                   // 更新内容の確定
  .....

注意事項
接続するDBMSがSQL Serverの場合,CloseメソッドでResultSetを削除してからCommitメソッドを呼出してください。Closeメソッドを呼ばないと排他ロックが解除されません。
BLOB型データの渡し方
Executeメソッドで,TYPE_BLOB_FILEを指定した場合は,BLOB型のフィールドに対するGetFieldメソッドの引数にファイル名称が戻されます。この場合,GetFieldメソッドの引数の型には,文字列と同様に,LPTSTRを指定してください。
XDM/RDをご使用の場合の注意
XDM/RDをご使用の場合,LONG VARCHAR型, LONG NVARCHAR型,及びLONG MVARCHAR型のフィールドのデータの更新はできません。SetFieldメソッドで値を設定しても,Updateメソッドの実行時にエラーになります。

(2) UPDATE文を利用した更新

UPDATE文を使ってレコードを更新できます。これは,既に更新するデータや内容が特定できる場合に,UPDATE文で直接,更新個所及び値を指定する方法です。UPDATE文を利用してデータを更新するにはDBRDatabaseクラスのExecuteDirectメソッドを使用します。

////////////////////////////////////////////////////////////
/// SQLの実行(更新) - DBRDatabaseクラスでUPDATE文を指定
   pDB1->ExecuteDirect("UPDATE TABLE1 SET F1=100 WHERE F2=300");
   pDB1->Commit();