初日 最新 目次 MAIL HOME


*-- To Tell The Truth --*
Cruz
MAIL
HOME

My追加

2002年01月23日(水)
仕事は好きですか?

仕事は続けていて、
時々休暇を取るのが好きです。



昨日からの作業ファイルデータをDBにUPDATEするプログラムを作成している。

・・・と、上司(※いつものジジイの更にその上:ここではオジサマ2と呼ぶ)が、FIXしたモノを見せてくれとやってくる。


ほれほれ、こぉーんな感じ


見せてみた。すると、


ううむ、これじゃヤバイなぁ


なぬっ?

私は、上司(※いつものジジイ:オジサマ1とする)に言われたとおりに作っただけだぞ?


そして怒涛のオジサマ会議。
オジサマ1+オジサマ2+私

オジサマ達の話しは、突然あっちへいったりこっちへいったり、過去へ行ったり未来に行ったり(未来へは行かなかったか?)めまぐるしい。
そして結論は、私の作業が倍増するということ。

仕様が・・・・。
お客様を抜きにしても、オジサマ同士で理解し合えていなかったようだ。


・・・開発作業の
2度手間になっていますが?



こんな開発やっていてこの会社はいいのだろうか?


===========

それはさておきファイルデータをDBにUPDATEが完成したので、お約束(?)ポイントソースの公開。

-------

 IADORecordBinding *picRs = NULL;

 // COMの初期化処理
 ::CoInitialize(NULL);

 try{
  // ADOオブジェクトの生成
  m_pConnect.CreateInstance(__uuidof(Connection));
  m_pCommand.CreateInstance(__uuidof(Command));
  m_pRecordset.CreateInstance(__uuidof(Recordset));

  // データベースへの接続
  m_pConnect->Open(
   _bstr_t(DB2_NAME),
   _bstr_t(DB2_USERID),
   _bstr_t(DB2_PASSWD),
   adConnectUnspecified);

  // SQLの設定
  m_pCommand->ActiveConnection = m_pConnect;
  SetSelect(); // 検索条件格納処理
  m_pCommand->CommandText = _bstr_t(cpSQLStr);
  m_pRecordset->PutRefSource(m_pCommand);

  // レコードセットの取得
  _variant_t vNull; // VARIANT型のNULLとして使う
  vNull.vt = VT_ERROR;
  vNull.scode = DISP_E_PARAMNOTFOUND;
  m_pRecordset->Open(vNull,
           vNull,
           adOpenDynamic,
           adLockOptimistic,

           adCmdText);

  // レコードのバインドを行うインターフェイスポインタ取得
  if(FAILED(m_pRecordset->QueryInterface(__uuidof(IADORecordBinding),
         (LPVOID*)&picRs))){
         _com_issue_error(E_NOINTERFACE);
       }
  picRs->BindToRecordset(&m_rsRecSet);

  // 先頭レコードへ移動し、フィールドの値を取得
  m_pRecordset->MoveFirst();

  // 更新データファイルオープン
  if((fp = fopen(gUpdateInf.cpFileName, "r")) == NULL){
    return FALSE;
  }

  m_pConnect->BeginTrans();

  while(!m_pRecordset->GetadoEOF()){
   SetData();
   m_pRecordset->Fields->GetItem(vName)->Value = vValue;
   m_pRecordset->MoveNext();
  }

  m_pRecordset->UpdateBatch(adAffectAllChapters);
  m_pConnect->CommitTrans();

 }
 catch (_com_error &e)
 {
  dump_com_error(e, hWnd);
  return FALSE;
 }

-------

一度SELECTで取得したデータに対し、カラムごとのUPDATEを行っています。
前回のSELECT結果表示だけの場合と、SELECT実行時のオプションが違っています。

adOpenDynamic:動的カーソルを開きます。
adLockOptimistic:レコードごとの共有的ロック

m_pRecordset->UpdateBatch(adAffectAllChapters);未処理のバッチ更新をすべてディスクに書き込むハズなので、adLockBatchOptimisticでもよさそうなものですが、adLockBatchOptimisticだとエラーになりました。
なぜ?

レコードバインディングをしているので、
m_pRecordset->Fields->GetItem(vName)->Value = vValue;
picRs->Update((&m_rsRecSet);
にしてみたのですが、Updateが行えていないようです。
エラーは出ませんが・・・。
うう〜む??

m_pConnect->CommitTrans();は入れないとエラーになったので、入れておきましたが、m_pConnect->BeginTrans();はあの位置でいいのかどうか、わかりません。


いろいろ疑問は残りますが、自分で使うだけのツールなので、この辺で許してもらいたいものです。