DABroker for C++

[目次][用語][索引][前へ][次へ]

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();                   // データベースの更新をコミット
  :