*-- To Tell The Truth --*
Cruz
MAIL
HOME
|
|
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();はあの位置でいいのかどうか、わかりません。
いろいろ疑問は残りますが、自分で使うだけのツールなので、この辺で許してもらいたいものです。
|
|