2.7.3 ResultSetを利用した要素の更新

ResultSetを利用した繰り返し列の要素を更新する方法について説明します。

<この項の構成>
(1) 繰り返し列の要素の更新
(2) 繰り返し列の要素の一括更新

(1) 繰り返し列の要素の更新

簡易版クラスを使用している場合,DBRDatabaseオブジェクトのGetArrayDataFactoryメソッドでDBRDatabaseオブジェクトごとにDBRArrayDataFactoryオブジェクトを生成します。詳細版クラスを使用している場合は,DBConnectionオブジェクトのGetArrayDataFactoryメソッドでDBConnectionオブジェクトごとに生成します。

  1. レコードをResultSetに探索し,要素をGetFieldメソッドで参照用DBRArrayDataオブジェクトに取込みます。
  2. 参照用のDBRArrayDataオブジェクトからCreateArrayDataメソッドで更新用DBRArrayDataオブジェクトを生成します。
  3. DBRArrayDataオブジェクトの要素をSetDataメソッドで更新します。要素にNULLを設定する場合は,SetNullメソッドを呼び出します。要素にNULLを設定しても,その要素はUPDATE文のDELETE句で要素を削除した場合のように削除されません。
  4. 繰り返し列は,SetFieldメソッドでResultSetに反映します。

(例)社員表テーブルの資格フィールドを検索して,要素の値がDatabaseであればDSPに変更する例です。

/////////////////////////////////////////////////////////////
/// SQLの実行(要素の更新)- 検索したレコードを更新
DBRDatabase *pDB1;
DBRResultSet *pResultSet;
DBRArrayDataFactory *pFactory = NULL;
DBRArrayDataPtr pArray2;
DBRArrayDataConstPtr pArray1;
int   nArray;
LPTSTR youso;
   :
   :
// DBRArrayDataFactoryオブジェクトの生成
 pFactory = pDB1->GetArrayDataFactory();  
 pResultSet = new DBRResultSet(pDB1);
                                     // ResultSetオブジェクトの生成
// レコードの検索
 pResultSet-> Execute("SELECT 資格 from 社員表",TYPE_EXCLUSIVE);
 pResultSet->Open();                      // ResultSetへの読込み
 if(pResultSet->GetArraySize(1) > 0)      // 繰り返し列かどうかの判定
 {
   while(!pResultSet->IsEOF())            // 検索結果の終わりの判定
   {
// 繰り返し列の要素を参照用DBRArrayDataオブジェクトに読み出す
     pResultSet->GetField(1,&pArray1);
// 参照用のDBRArrayDataオブジェクトをコピーして
// 更新用のDBRArrayDataオブジェクトを生成
     pArray2=pFactory->CreateArrayData(pArray1);
// 繰り返し列の要素数分処理
     for (nArray=1;nArray<=pArray1->GetArrayCount();nArray++)
     {
// 要素を読み出し,Nullかどうかを判定
       if(pArray1->GetData(nArray,&youso))
        {                                      // Nullでない場合の処理
         if(strcomp(youso,"Database")==0)      // 要素の値を確認
           pArray2->SetData(nArray,"DSP");     // 要素の値をDSPに更新
        }
     }    
     pResultSet->Edit();                       // レコードの更新準備
// 更新用DBRArrayオブジェクトの繰り返し列をResultSetに反映する
     pResultSet->SetField(1,pArray2);        
     pResultSet->Update();                     // データベースを更新
// Updateメソッド終了後更新用のDBRArrayDataオブジェクトを削除
     delete pArray2;
     pResultSet->Next();                     // カレントレコードを更新
   }
 }
 else                                        // 繰り返し列でなければ
  cout << "Not Array Field";                 // Not Array Fieldを表示
 pDB1->Commit();                      // データベースの更新をコミット
 :

(2) 繰り返し列の要素の一括更新

次の順序で繰り返し列に設定する要素の値を準備します。

DBRArrayDataFactoryオブジェクトのCreatArrayDataメソッドに繰り返し列の型を指定しDBRArrayDataオブジェクトを生成します。次にDBRArrayDataオブジェクトのCreateメソッドで要素数分の領域を確保します。 DBRArrayDataオブジェクトにはSetDataメソッドで要素の値を設定します。 DBRArrayDataオブジェクトの値はSetFieldメソッドでResultSetに反映します。

(例) 社員表テーブルの資格フィールドに要素1syu,Database,Networkを新規に追加する例

//////////////////////////////////////////////////////////////
DBRDatabase *pDB1;
DBRResultSet *pResultSet;
DBRArrayDataFactory *pFactory = NULL;
DBRArrayDataPtr pArray1;
   :
   :
// DBRArrayDataFactoryオブジェクトの生成
 pFactory = pDB1->GetArrayDataFactory();  
// DBRArrayDataオブジェクトの生成
 pArray1 = pFactory->CreateArrayData(COL_TYPE_CHAR,10);
 pArray1->Create(3);               // 3要素分の領域を確保
 pArray1->SetData(1,"1syu");       // 1番目の要素に1syuを設定
 pArray1->SetData(2,"Database");   // 2番目の要素にDatabaseを設定
 pArray1->SetData(3,"Network");    // 3番目の要素にNetworkを設定
      :
 pResultSet = new DBRResultSet(pDB1);
                                   // ResultSetオブジェクトの生成
// 氏名IDがZ004のレコードを検索
 pResultSet-> Execute("SELECT 資格 from 社員表
                              where 氏名ID='Z004'",TYPE_EXCLUSIVE);
 pResultSet->Open();               // レコードをResultSetに読込む
 pResultSet->Edit();               // レコードの更新準備
// DBRArrayオブジェクトの繰り返し列をResultSetに反映
 pResultSet->SetField(1,pArray1);
 pResultSet->Update();             // データベースを更新
 pDB1->Commit();                   // データベースの更新をコミット
 :