2.6.3 レコードの更新

データを更新するには,前節で説明したResultSetを利用する方法と,SQLのUPDATE文を利用する方法とがあります。

<この項の構成>
(1) ResultSetを利用した更新
(2) UPDATE文を利用した更新
(3) 更新可能なResultSetの取得時の注意

(1) ResultSetを利用した更新

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();
  }
// その他の処理
.....

BLOB型データの渡し方
SetResultSetTypeメソッドで,TYPE_BLOB_FILEを指定した場合は,BLOB型のフィールドに対するGetFieldメソッドの引数にファイル名称が戻されます。この場合,GetFieldメソッドの引数の型には,文字列と同様に,LPTSTRを指定してください。
XDM/RDをご使用の場合の注意
XDM/RDをご使用の場合,LONG VARCHAR型, LONG NVARCHAR型,及びLONG MVARCHAR型のフィールドのデータの更新はできません。SetFieldメソッドで値を設定しても,Updateメソッドの実行時にエラーになります。

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

SQL文のUPDATE文を使って,データを更新できます。これは,既に更新するデータや内容が特定できる場合に,SQL文で直接,更新個所及び値を指定する方法です。この方法では,現在のデータを確認してから更新することはできません。

次に,DBStatementクラス及びDBConnectionクラスを使用して,?パラメタを使用しない更新をする場合と, DBPreparedStatementクラスを使用して,?パラメタを使用した更新をする場合の三通りについて説明します。

(a) DBStatementクラスを使用した場合

DBConnectionクラスのCreateStatementメソッドでDBStatementオブジェクトを生成します。次にDBStatementクラスのExecuteメソッドにSQL文を指定してメソッドを呼び出し,データを更新します。

//////////////////////////////////////////////////////////////
/// SQLの実行(更新) - DBStatementクラスでUPDATE文を指定

  // DBStatementオブジェクトの生成
pStatement = pConnect->CreateStatement();
  // SQL文の実行
pStatement->Execute("UPDATE TABLE1 SET F1=100 WHERE F2=300");

(b) DBConnectionクラスを使用した場合

DBConnectionクラスのExecuteDirectメソッドでSQL文を実行してデータを追加します。

この方法は手順が簡単ですが,データをいったん検索してから更新したい場合は,DBStatementクラスを使用してください。DBConnectionクラスでは検索結果を受け取ることができないため,検索ができません。

//////////////////////////////////////////////////////////////
/// SQLの実行(更新) - DBConnectionクラスでUPDATE文を指定

  // SQL文の実行
pConnect->ExecuteDirect("UPDATE TABLE1 SET F1=100
                                             WHERE F2=300");

(c) DBPreparedStatementクラスを使用した場合

?パラメタを記述した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();

(3) 更新可能なResultSetの取得時の注意

SetResultSetTypeメソッドで引数にTYPE_EXCLUSIVEを指定した場合,GetResultSetメソッドで更新できるResultSetが取得できます。ただし,次の場合には,SetResultSetTypeメソッドの引数にTYPE_EXCLUSIVEを指定するとExecuteメソッド実行時にエラーをスローします。

また,XDM/RDを使用している場合,検索結果にlong列(long mvarchar型,long nvarchar型, long varchar型)を含んでいると,そのフィールドに対しては,Updateメソッドを実行できません。