初日 最新 目次 MAIL HOME


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

My追加

2002年01月31日(木)
今さらですがUPDATE

UPDATEのSQL文だけしか紹介していませんでしたね。
覚書き日記・・・。



で、気を取り直して

UPDATE




============= 参考部分 =============

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

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

 // データベースへの接続
 m_pConnect->Open(
    _bstr_t(gDB.cpServerName),
    _bstr_t(gDB.cpUserID),
    _bstr_t(gDB.cpPassword),
    adConnectUnspecified);

 // UPDATE文作成
 SetUpdate(); // private関数
 _bstr_t bstrQuery(cpSQLStr);
 _variant_t vRecsAffected(0L);


 m_pConnect->BeginTrans();

 // UPDATE実行
 m_pConnect->Execute(bstrQuery,
        &vRecsAffected,
        adOptionUnspecified);

 m_pConnect->CommitTrans();


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

 return TRUE;

=============

とまぁ、こんなもんです。

1レコードづつの更新なので、Executeで実行しています。
CommitTrans();Commitですね。
BeginTrans();は、実行前ってことでExecute直前にしておきました。



2002年01月30日(水)
あまのじゃく仕様

データのUPDATEもつつがなく完成し、あれこれと動作確認をしてみる。



・・・何か変だ?



仕様を確認。データ内容を確認。

発見したものは、



>(記号)が逆



どーりで検索結果が、変だったわけだ。
SELECT文でやらかしていた


気を取り直して、更に動作確認をすすめる。



まただ。何か変なんだな。



仕様を確認。データ内容を確認。

発見したものは、



>(記号)が逆



今度は表示色設定条件が逆になっていた。



気を取り直して、更に更に動作確認をすすめる。



んんんん?



仕様を確認。データ内容を確認。

またもや発見したものは、





>(記号)が逆






何もかも逆にして、仕様に背きたかったのだろうか?←自分



2002年01月29日(火)
Oracleがわがままなのか?

私が使っているのは


DB2

なんです。





とうとう(?)選択データのUPDATEを行う・・・という仕様が加わったため、
UPDATE文の作成を行う。一度にUPDATEする項目は3つ。
そのうち1つに値が入り、あとの2つにはNULLを入れるというもの。


UPDATE DATA SET C2 = '', C3 = '', C4 = '1234' WHERE C1 = '123'

とやってみる。

UPDATEはOK。
では、SELECT。


SELECT * WHERE C2 IS NOT NULL


おや?
C4に値を入力したレコードもヒットしている。



DB2では、
’’で入力した値は
長さ0の文字列
になるらしい。


NULLにはならないのね。
NULLを入力するには、

UPDATE DATA SET C2 = null, C3 = null, C4 = '1234' WHERE C1 = '123'

としないとダメだそうな。


こちらを参照


そんな話し聞いてないよ。



2002年01月28日(月)
車中マナーに物申す

私は、ちゃっかり(?)10時出社なので、朝はそんなに混み混みラッシュではない。
どちらかというと、残業帰り時間帯の酔っ払いラッシュで気分の悪い思いをすることが多い。

しかし最近、時間帯に関係なく迷惑と思われるのが、


足を組む


人がやたらと多い。
それも若い人、男女問わず。

がら〜んがらんに空いている車中なら、勘弁してあげよう。
しかし、そこそこ混んできて目の前に人が立っているのに


足を組みつづける


のは、いかがなものか?

立っているこちらは、組まれた足の靴が自分の服に触れないように妙な姿勢をとらざるを得ない。
そんな状態なのに、足の組みなおしまでされたりする。

靴が触れると言えば、後ろ向きに座る子供にもいえることなのだが、これも靴を脱がせるのがマナーではないのか?
最近、脱がせずにいる親が多いのだけど・・・。




大声で話しをしているグループ

も、ちょっと迷惑。
話しの仕方にもよるのだろうが、先日出会った酔っ払いおじさんグループは、


残業後の帰宅途中。
座れたので寝ている私。お疲れモードだったしね。

あまりの五月蝿さに目が覚める。

私の両隣には酔っ払いおじさん



私を挟んで、大きな声で会話中



まさに、ステレオスピーカー状態。

寝ている人の方が偉いと言う訳ではないが、その人を挟んで大声での会話ってどうよ?

私が起きてもカンケーなく続く大声会話。
余程「席、替わりましょうか?」と言おうかと思ったが、そこまでしてやるのもバカらしく、声をかけることすらおぞましく感じたので(相手は酔っ払いだし)席を立ちました。

私が席を立ったら、こりゃラッキーとばかりに、おじさん達は一塊に寄り添って、それでも大声で会話を続けていました。



まぁ、これは相手が酔っ払いだったという事もあるでしょう。




では、外人さんの場合は?

今朝、そんなに混んではいないが、立っている人もそこそこいる車中。



大声で会話をする
外人さんグループ



に出会いました。

こちらもかなり五月蝿い。
ただ、しゃべっているのは、やはり英語

この際、英語のヒアリングでも・・・と聞いては見るが、朝の寝ぼけ頭には、静かな車中で居眠りするくらいが快適というもの。

やはり


迷惑


だと感じました。



2002年01月27日(日)
猫と子供の根競べ

今日は、懇意にしている店マスター家族私の友人を、我が家に招いてホームパーティを行った。

最初は、のつもりだったんだけど、なんとなく気分で手巻き寿司に変更。

朝起きて大急ぎで買い物に行き、ダンナは歯医者へ・・・。
予約していたとはいえ、ちょっと・・・あの・・・。


準備は私一人


って、ちょっとどうかと思うのですが。


準備中、ものすごい形相でキッチンに立つ私に恐れをなしたのか、甘えた声で鳴いていた猫達もどこかへ消える。




--- お客人到着 ---


相変わらずシャイな獅子丸(猫)は、テレビの後ろに隠れる。
三四郎(猫)は・・・いつもどーり、出窓でくつろいでいる。

マスターのお嬢さんは、三四郎がお気に召したらしい。


三四郎に「こっちへ来て」
と話しかける。



自分のママを使い、
三四郎に絵本を読んで聞かせる。



三四郎の頭をなぜる。


すると、


ぱくっ


噛まれる。




泣いたり騒がれなかったのがせめてもの救い。
見ていたこっちが、ヒヤヒヤものだった。

それから、三四郎の彼女に対する態度は、



シャー


と、威嚇。




それでもめげずに、出窓(※三四郎が居る)に一番近い席に陣取り、


こっちへ来て


と話し掛けつづける彼女。
彼女の思いが通じるのはいつの日か・・・。



2002年01月26日(土)
盲点

※正確には、昨夜のできごとである。

会社帰りに、ネット友人のお宅兼お店へ寄る。
マシンのセットアップで手間取っているようだった。

Outlookの旧データ(アドレス帳とか受信メールとか)をNewマシンへ移行したいらしいのだが、うまくいかないらしい。

要は、

サポートセンター

として、出動してまいりました。
他3名

バックアップはこの方法で取っていたようなので、そのとおりにインポートしてみるが、何やらエラーが出て取り込めない。

おかしいなぁ?とあれこれ聞いてみると、

バックアップデータは最初CD-Rに焼いて、
それをNewマシンのハードに置いた


との事。
その時は、あまり気にも止めなかったが、いろいろやってはエラーが出るたびに・・・
もしや、ファイルのプロパティが・・・?

読取り専用

になっておりました。

読取り専用ファイルは、インポートできませんものねぇ。
対象データファイルの読取り専用を全部外して、めでたくインポートできました。

CD-Rに焼いたデータは、ハードに落としても読取り専用のままでしたね。
そーいや。

作業的には、

なぁ〜んだ

の部類ですが、意外とこういうのって一人でやっているとぶち当たる



なんですよねぇ。

最近、プログラムを作りながら似たようなにぶち当たってばかりいるので、壁慣れしていたりして・・・。



2002年01月25日(金)
これも失敗

Visual C++ Extensions

使用しています。

データ取得時に、DBデータの中身がNULLだと、セットした変数にデータは格納されず、エラーを返しているんですね。

例えばこれ

ADO_VARIABLE_LENGTH_ENTRY2(6,
             adChar,
             stData.cpUseTime,
             sizeof(stData.cpUseTime),
             lau_lUseTimeStat,
             FALSE)

データがNULLだと、lau_lUseTimeStatが入っていました。
他のデータ取得ができたものはでしたが・・・。


そういえば、MSDNのエクステンションのサンプルでも

  printf("\a\tName: %s\t %s\tPhone: %s\n",
   (lau_fnameStatus == adFldOK ? m_szau_fname : ""),
   (lau_lnameStatus == adFldOK ? m_szau_lname): ""),
   (lau_lphoneStatus == adFldOK ? m_szphone): ""));

こんな風になっていた。
ちゃんと解読していなかった私が悪いんだけど・・・


NULLの時は、
NULL入れてくれたってイイジャン


なんて事も考えましたがねぇ・・・。

だって、SQL(SELECT WHERE文)は

USEDATE IS NULL

とか、やるじゃないですか。

そーいう問題でもないんだろうけど。



2002年01月24日(木)
三四郎とピンポン

年齢:86歳
性別:女性
趣味:水泳
近況:小さな子供が好き。
   孫は結婚しそうもないので、ついつい、小さな子供を見かけると話し掛けてしまう。


今朝、電車の中で見かけたおばあさんのプロフィール。
小さな子供を連れた女性が、このおばあさんと話していた内容から作成しました。
ようするに盗み聞きってこと・・・。

自分の祖母や、ダンナの義祖母の歳と照らし合わせても、86歳のおばあさんが、一人で比較的混んでいる電車に乗りしかも立っている
それだけで

驚き

なのに、。
このおばあさんときたら、

趣味は水泳。
泳ぎを続けていると、腰や膝が痛くならなくて調子がいいんですよ。


と来たもんだ。

86歳で泳いでいるのか・・・

人生ブラボー!

意味不明


それはさておき、昨日作成したファイルデータをDBにUPDATEするプログラムを使って、DBへデータを登録していく。
登録をサクッとこなし、オジサマ仕様変更に着手。

残業をしていたら、まぶたが痒い。
・・・また、目が腫れてきたようだ。
これじゃ三四郎と一緒だな。2002.1.21日記より
私のは結膜炎じゃないけれど。

今回ファイル選択のところで、

GetOpenFileName

使ってみました。
ワードやExcelなんかで、『開く』を選択すると出てくるアノ画面ですな。

// 更新ファイル名選択
BOOL OpenSelectFiles_CARD(HWND hWnd)
{
 OPENFILENAME ofn;
 memset(&ofn, 0, sizeof(OPENFILENAME));
 ofn.lStructSize = sizeof(OPENFILENAME);
 ofn.hwndOwner = hWnd;
 ofn.lpstrFilter = "text files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
 ofn.lpstrFile = cpFileName;
 ofn.nMaxFile = MAX_PATH;
 ofn.Flags = OFN_FILEMUSTEXIST;
 ofn.nMaxFileTitle = 64;
 ofn.lpstrFileTitle = cpFileTitle;
 ofn.lpstrTitle = "Update File";

 return (GetOpenFileName(&ofn));
}

cpFileTitleに選択されたファイル名が入ります。
ファイル名はフルパスではないようなのですが、
そのまま
 fp = fopen(cpFileTitle, "r");
で、ファイルオープンできます。
ファイル選択したときにパスでも通してくれているのでしょうかねー?

詳しくはこちらをどうぞ。




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();はあの位置でいいのかどうか、わかりません。


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



2002年01月22日(火)
行き当たりばったりプロジェクト

プロジェクトそのものはね。
それなりの目的があって、営業活動の成果だとは思う。

どんな環境で開発し運用を行うのかは、わかった。
どんなことができるものが欲しいのかも、だいたいわかった。
だから作れた。

だからと言って、やはり開発作業には開発スケジュールってのも重要だと思うし、作業分担も・・・。
欲を言えば、概要設計でお客様の承認をいただき、詳細設計でプロジェクトリーダーの承認をいただき、それから開発作業に入りたいものだ。

もちろん、設計の時点で、テストデータの準備やテスト運用スケジュールなんかも考えたりして・・・。

今やっている私の仕事。
DBクライアント側のたいした事もないプログラムだから、やっぱり口頭仕様だったりする。
メールで送られてきた仕様もあるにはあるが・・・。
DBテーブルリスト画面遷移の絵を基に作りました。

・・・で、今日からテストデータ作成。
開発中に使用していたのは、実は生データ。
外に流出するとマズイ(賠償問題になったりするんじゃないか?)やつ。
そこで、そのデータのまずそーな項目を変更しようというもの。

変更用に・・・と、何やら各項目オンリーデータが数千件程入力されているファイルを受け取る。
1項目1ファイル。
1ファイルの件数は1000件程度から2000件くらい。
現在、DB登録されているデータは1万件くらい。

なんだか中途半端に面倒くさい作業だな。
ファイル読み込みUPDATEプログラムを作っています。



2002年01月21日(月)
緊張の糸

切れたのか、もつれたのか、本日も今朝から体調悪し。
おまけに、三四郎(猫)の目も腫れている。
・・・また、結膜炎だね。キミは。

大雨も降っているし、ここで無理をしても仕方がなさそうなので、本日休業とする。
ついでに、三四郎を病院に連れて行く。

お出かけ好きな三四郎は、自ら進んでキャリーの中へ。

その場で飲み薬を飲ませ、目薬をもらってかえる。



少し余裕が出来てくると考える。
ダンナの転勤、私はどうしよう?

とりあえず単身赴任。
・・・で、いつかは同居(=私も大阪)?
それともずっーと単身赴任?

引越しはいつ頃になるんだ?
3月いっぱいで今の職場を辞めるとして、失業保険の給付とか、バイトとかどうしよう?
大阪で手ごろなバイト(同職種)が見つかるのなら、一緒に行ってもいいんだけどねぇ。
そんなウマイ話しは無いしなぁ。

そもそも、私は関東以外に住んだことが無い。
大阪へ行って暮らせるのか?
「転勤生活お試し期間」とか、あるといいのにな。



2002年01月20日(日)
家事に励め

昨日、洗濯しかやらなかったので、本日は掃除に買い物・・・もりだくさん。
ちょっと競馬もしたりして。

それなりに有意義な休日を過ごす。

父に頼まれたCDを焼くためにマシン部屋へ・・・。
最近、家のマシンをちっともいじっていない。
寒いからなぁ・・・マシン部屋。



2002年01月19日(土)
休日を休日らしく

昨夜、飲みすぎたかどうかは別として、「仕事に行く」ダンナを送り出し、洗濯をし・・・洗濯しかできずに、横になる。
なんだか体調が優れない。

風邪をひいたか?

一段落したと思われる仕事から、知恵熱か?

二日酔いか?



2002年01月18日(金)
The End

自分の中では、本開発業務の一応の終わりがついたと思う。

さらっとインストールマニュアル等も仕上げ、Fixしてソース&マニュアルを上司に転送しておいた。
来週は、「これをこうして」「あれをこうして」「ここのところ、こうならないかなー?」対応が待っているのだろう。
でもまぁ、心にゆとりができた私はそつなくこなして見せましょう。

・・・ということで、自分自身を労うために整体へ。
全身ガチガチにこってます。

・・・ということで、自分自身のために打ち上げへ。
家のそばで、ダンナ&ダンナ会社後輩くんと飲みました。



2002年01月17日(木)
終焉近し

セキュリティ問題については、口で説明をするとけんか腰になるといけないので、メールでお伝えした。
ついでに・・・別上司経由で愚痴じゃなく相談をしておいたら、それとなく伝わっていたらしい。
何事も手回ししておくに限る。

かねてから気になっていたwarningを外す。

=================

// warningの無効化
#pragma warning(disable : 4146)

// dllのimport
#import "C:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename( "EOF", "adoEOF")

=================

アイコン製作などをする。


終わりが近づいてきたようだ。



2002年01月16日(水)
システム考察

開発中のシステムは、DBクライアントアプリケーションである。
アクセスするDBの登録データは、カナーリな○秘個人情報である。
誰でも彼でも使えてしまうと、マズいアプリケーションである。

開発の話しが出た当初から、オヤジ暗号化と騒いでいた。
オヤジの言う暗号化とは、

DB接続のID,Passwordを
XXX.iniファイルとして置き、
そのファイル内に記述されている
Passwordをエンコードしておく


ということだった。

そして、暗号化関数として提供されたのは、デコード関数のみであった。

とりあえず、無視して開発を始めたが、いよいよ無視することができなくなった。


・・・よく考えてみよう。

セキュリティについて考え、
Passwordの暗号化を思いついたのであれば、
この方法では穴がありすぎる。


●手製の暗号化関数なんて調べりゃ簡単にキーがバレバレ。
●DBサーバーに直接ログインする方法を知らなくても、本開発アプリを立ち上げてしまえば、DB登録データの取得は簡単。
●本開発アプリを立ち上げっぱなしで離席した場合、DB登録データが丸見え。
●そもそも、DBサーバーのログイン情報をファイルで置いておく方が問題。


以上の点からしても、この暗号化は無意味。


せっかくw2kで開発しているので、私としては・・・

●w2k登録ユーザーによって、アプリ起動に制限をかける。
(特定ユーザーでw2k起動時にログインした時のみ、アプリも起動できるようにする)
●アプリ起動時にDBユーザーIDとPasswordを入力し、実際にDBコネクトしてログインチェックをする。
(DBユーザーIDとPasswordを知る人しか、アプリ起動も行えない)
●離席時対策として、w2kのスクリーンセーバー設定でパスワードによる保護をチェックしておく。
(w2k登録ユーザーのパスワードを再入力しないと、画面表示ができない)

これにできると、暗号化とか余計な処理を作らなくてすむんだけどなぁ。


上手く説明しないとまた・・・

屁理屈ばかり言うんじゃない

って言われるんだよな。
こっちだって

もう少しSEらしい仕事して下さい

って言ってやりたいよ。・・・ったく。

システムの全体を把握できないから、何が重要なのかも理解してないくせに。
どこで仕入れてきたか知らないが、なんでもかんでも「暗号化」って騒ぐんじゃない。



2002年01月15日(火)
波に乗る

サクサクとプログラム作りをこなし、一応DB検索結果のリスト表示→詳細表示まで終了する。

明日、表示文字列のカスタマイズ処理を入れれば、今週末までに一連動作の完成スケジュールを無難にこなせたことになる。



・・・ああ。

最大の難関


頭の固いオヤジ(※上司)に
セキュリティについて
語らなければいけないんだった。


ものすごく、気が重くなった。



2002年01月14日(月)
大人になる日

最近、成人の日は連休になるように仕組まれている。

そして我が家の酔っ払い怪獣は、二日酔いでダウン。
昨夜は家に着くなり居間でひっくりかえり、起こすと怒るので布団をかけてそのまま放置した。

朝、起きていくと、なぜかゲームをしている。
気持ち悪くなって目が覚め、ゲームをしているそうな。

そしてこれから今度は布団で寝ると言う。

まぁ、いいんですけど・・・。

夕飯は酔っ払い怪獣改めダンナが、罪滅ぼしの為に作ってくれました。



2002年01月13日(日)
酒に呑まれる

午後から買い物に出かけ、ズボンのお尻ばかりやぶくダンナのスーツを買う。
靴も買う。

その後、多摩へ・・・。
寿司を食べに行った。

そこには、ダンナ会社後輩君も彼女連れでやってくることになっている。
しかし、今回連れてくる彼女は前回と違うので、そこのところを寿司屋のマスターに言い含めておく。

車で行ったので、飲みは控える。
ダンナは「醒めるから大丈夫」と言っていたが・・・・やはり口ばっかりだった。

大酔っ払いじゃないか



運転すると言い張ったダンナに、頼み込んで運転手を代わってもらい。

コーヒーを買ってくれというダンナに、缶コーヒーを持たせ。
後ろから「あおってくる」と言ったダンナは、缶コーヒーを窓の外に投げ捨てた。

高速では、高いびきで寝ている。
工事渋滞中に目が醒めると、「何で混んでいるんだぁ?」と悪態をつく。


酔っ払い怪獣をなだめすかしながら、家までちゃんと帰れた私ってエライ?

ウルウル (T-T)ヾ(^^ ) ヨシヨシ




2002年01月12日(土)
ストアード・プロシージャー(IBM風)

stored procedure

・・・ということらしいので、巷で呼ばれているストアドプロシージャより、英語的なのかも。


プロシージャーそのものは複雑な事をしようとしなければ、そんなに難しそうではない。
むしろサーバー側に設置して実行可能状態にする方が難しそうだった。

おまけにDB2にはストアード・プロシージャー・ビルダーが用意されていて、プロシージャーの作成からサーバー側への設置まで簡単に済むらしい。

・・・が、

世の中そんなに甘くない

まず、ストアード・プロシージャー・ビルダーを立ち上げた。
DBサーバーに接続した。

SQLストアードプロシージャー作成ができない。
SQLストアードプロシージャー関係のボタン・メニュー共に選択できない状態だ。

しょーがないからウィザードを使用したJavaストアードプロシージャーを作成する。
対象DBにも接続されているので、レコードをほいほい選択するだけで、ストアードプロシージャが完成してしまう。
ちょっとだけ・・・条件文を手書き入力。

そしてビルド

==================(ビルダー出力より)

HOGE.ALLLIST - SQLJ プリコンパイルが完了しました。

HOGE.ALLLIST - Javac が完了しました。

HOGE.ALLLIST - クラス・ファイルが更新されました。

HOGE.ALLLIST -

[IBM][SQLJ Driver] SQJ0001W プロファイル "ALLLIST_SJProfile0" をカスタマイズしています。




PROFILE NAME: ALLLIST_SJProfile0
SOURCE PROGRAM: ALLLIST.sqlj

ENTRY LINE  MESSAGES
------ -------- ----------------------------------------------------------
       SQL0060W "SQLJ" 事前コンパイラーが処理中です。
       SQL0091W 事前コンパイルまたはバインドが、"0" エラーと "0"
            警告で終了しました。


HOGE.ALLLIST - Jar ファイルが作成されました。

HOGE.ALLLIST - [IBM][CLI Driver][DB2/6000] SQL4301N Java 解釈プログラムの始動あるいは通信ができません。理由コード "1"。 SQLSTATE=58004



HOGE.ALLLIST - ビルドは失敗しました。

HOGE.ALLLIST - 変更がロール・バックされました。


==================

設置ができないようだ。。。
これじゃ、使えん。




2002年01月11日(金)
スケジュール通り

昨日、大騒ぎした『SQL文が長すぎて桁落ち』現象は解決しました。

昨日の日記では、オオイシさまから、アドバイスメールを頂き、恐悦至極、感謝感激・・・同業の知り合いが少ないもので、ホントに嬉しかったです。


そして恥ずかしながらも

■解決編■

Viewの使用

Viewというものを正しく理解していませんでした。
SELECTする直前に作成するものじゃなくていいものだったんです。
DB2だと『視点』と言う表現で説明されていました。

一度作ってずっーーと置いておいて、クライアントからは
置きっぱなしのViewに対してSELECTかければいいんですね。

ですから、SQL文の簡潔性を考えても、これは買いでした。

SQL格納文字列の大きさ

何気なくCHAR_MAXを使用していましたが、これはたったの127しかなかったんですね。
いくらなんでも、小さすぎました。

・・ということで、恥ずかしながらソース公開。

+++++++++

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

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

  if(SUCCEEDED(hr)){
   // 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,
            adOpenStatic,
            adLockReadOnly,
            adCmdText);

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

   // 検索結果件数
   if(m_pRecordset->GetRecordCount() <= 0){
     return FALSE;
   }

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

   // リストビューデータ表示
   DisplayList(hList);

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

+++++++++
try〜catch 入れました。
char cpSQLStr[CHAR_MAX * 3]; にしました。

検証したストアドプロシージャーについては、明日の日記で報告します。

明日はたいした日記ネタもないだろうから・・・



2002年01月10日(木)
DB鬱

力技で完成すると思っていたプログラム。
思わぬ落とし穴がありました。

なんと

SQL文が長すぎて桁落ち

呆然としました。
短いSELECT * FROM A_DATAとかなら、動くんです。
SELECTも実行できてるんです。これが長くSELECT a.NO a.NAME b.DATE b.TEL b.ADD FROM A_DATA a, B_DATA b WHERE ・・・なんて続いた時は、CommandTextに代入した時点で落ちます。

■私が考えた方法その1『VIEWを使ってみよう』
一度VIEWに吐き出し、その中から更にSELECTしようというもの。
多少検索スピードが遅くなろうが、SQLを短くして実行できればこっちのもの。

<結果>・・・・まだ、SQL文は長かった。

■私が考えた方法その2『ストアドプロシージャの利用』
簡単に言えば『サーバー側にSQL文をセットしておいて、クライアントから呼び出し使うもの』だそうな。
昨日から本を読み出しただけなので、認識違いがあるかも・・・?

MSDNを見てもCommandTextのところにストアド プロシージャの呼び出しなどって書いてあるし、これならきっと短い文でできるから大丈夫だろうと思う。

・・・が、


サーバー側に設置するストアドプロシージャって
どうやって書けばいいのさ?



私はDB初心者なんだよ。あんまり知らないんだよ。
構築経験もないし、せいぜいSELECTするくらいしか知らないんだよ。

さりげなく(?)サーバー側の設定をやってくれた人に『お願い』してみたのだが、別の仕事が忙しくてこっちに手が回せないらしい。
自分で調べてやってみて・・と、かわされてしまった。

DB精通者求む!




2002年01月09日(水)
曲奇と書いてクッキーと読む

おやつで中国のおかし(お土産)をいただいた。

芝士曲奇夾心派

春葱曲奇夾心派



というものだ。


芝士曲奇夾心派の方は、英語でCheese Pieと書かれている。
春葱曲奇夾心派の方は、Spring Onion Pie

どちらも少し厚めのヨックモッククッキーのような感じだった。
ちなみに、このクッキーの袋に会社のURLがあった。

なんとも中国的。



2002年01月08日(火)
宴の後

昨夜、酔っ払いが3人。
我が家に巣食っておりましたとさ。

酔っ払い1は、
酔っ払い2は、ダンナ
酔っ払い3は、ダンナ会社後輩君

酔っ払いたちのお陰で、酔っ払っていない私まで寝不足です。

それでも本開発、22時過ぎまで頑張りました。
もう、どうすればいいのかわかっているので、力技勝負です。

でも、まだまだ終わらない〜



・・・というか、作業量が多すぎると思うんですが。



2002年01月07日(月)
大阪鬱

大阪かぁ
大阪・・・

(ー’`ー;) ウーン



治療と両立できる私の仕事があるのなら、行ってもいいんだけどね。
やっぱ、難しいよなぁ。

そんなことを考えている間に、会社到着。
今日は仕事始め。

そーいや、早速本開発で忙しいんだな。>私

それでも時々、

大阪ねぇ



と考えこんでしまう。

いかんいかん、仕事、仕事。

・・・・

大阪かぁ



シゴト q(・・;q) ))) ((( (p;・・)p シゴト



2002年01月06日(日)
骨休め終了

長い年末年始休みも今日でおしまい。

昨夜は家族新年会で、私の両親・妹家族・ウチが集まった。
姪&甥は、我が家の猫達を追い掛け回し・・・猫達にとっては、迷惑この上ないといったところだろう。

今朝方にかけて、ずっーとゲーム三昧をしていたダンナはちっとも起きてこない。
私も少し風邪気味だし、まぁいいやと放置してた。

------ 昼過ぎ ------

のっそり起きてきて、朝とも昼とも言えないご飯を食べて、ダンナは、

洗車しに行こう



と言う。

σ( ̄。 ̄)ワタシモ?



と聞けば、そうだと答える。

買い物にも行かなきゃなー



・・・昼まで寝ていた人は、元気なようだ。


洗車場は混んでいた。
そして寒かった。
洗車をしているうちに、暗くもなってきた。
活動時間が遅すぎる

買い物は、時間が遅いせいか思いのほか空いていた。
それはそれで良いんだけどさぁ

しかし、私の風邪は悪化したと思われる。



2002年01月05日(土)
転勤問題本格化

ダンナ転勤問題について上司から呼び出しがかかる。

転勤先は、大阪
期間は最短で3年

もう、ほぼ決定なんだそうな。
これを拒否するには、会社を辞めて転職か・・・って事になるらしい。

我が家では、来年度、私は仕事を辞めて・・・いや自由のきくバイトにして、子作り治療に専念しようと考えていた。
そのため、派遣会社の方にも契約延長無しを申し出ている。
バイトの方も、それとな〜く前に勤めていた会社関係者に打診をしている。
しっかり失業保険も受け取ってから、細々と仕事をやれたらいいなと考えていた。

しかし、ここでダンナ転勤問題

ダンナの転勤で困ることといったら、まず治療。
2人揃わないと基本的に意味のない治療なので、治療をするのなら大阪の病院へ転院するか、治療時期だけダンナに帰ってきてもらうか。

そして私の仕事。
東京だから今まで仕事をしてきたコネがあるものの、大阪で仕事を探すとなると1から始めなければいけない。
1から探せばあるにはあるだろうけど、治療と並行してやれる『わがままのきく』仕事は望めない。

じゃあ、いっそ専業主婦で・・・としてしまい現場から身をひいてしまうと、もう2度とこの職種では仕事ができないだろう。
技術の進歩も早いしただでさえ既にロートルなのに、更にブランクまであったらもうどこも雇ってくれない。
バイトでもなんでも細々と続けていきたい。

じゃあ、3年間終了してこっちに帰ってきてから治療をすると。
その時、私はかなりの高齢。
治療をするには遅すぎるくらい。
おまけに3年間終了しても、ホントにこっちに帰って来られるかはその時にならないとわからない。

・・・ということで、私としてはダンナに単身赴任してもらいたい。

家だって、去年建てたばかり(2世帯だけど)だし。
治療のときだけ、私が大阪へ行き大阪の病院へ行ってもいいし、ダンナがこっちに帰って来てもいいし。
治療断念したときには、私はまたフルタイム復帰すればいいしね。

しかし・・・

ずっと単身赴任はさびしい

のだそうな。←ダンナ




2002年01月04日(金)
10時間耐える

雪も止んだし・・・・いや、また降るらしい。
ということで、通行止めが解除になっている間に帰ることにする。

岐阜発13:30頃。
埼玉着23:30頃。

トイレ休憩を数回とっただけで、寄り道も食事もせずに帰ってきたのに10時間もかかるとは・・・。

それも、その道中の半分以上(高速道路部分)は私が運転していた。


疲れました。




2002年01月03日(木)
断念

かなりの大雪で高速道路も通行止めになっていたりする。

・・・で、京都行きは断念しました。

義父のお墓参り、何年行っていないことやら。
それともこの大雪は、義父が来て欲しくないって事のあらわれ?

確かに、仏壇に供えた宝くじが外れてダンナは悪態をついていましたが


2002年01月02日(水)
東海地方大雪警報

昨日の分も合わせて、今日は1日ゴロゴロする。
しかし、外は雪。
それもハンパじゃなく、ガンガン降っている。

ウチの車はノーマルタイヤなので、外出不可能。
外出不可能なので、安心してゴロゴロする。



2002年01月01日(火)
賀正

今日は1日ゴロゴロする予定だった。
・・・が、急きょ亡き義父実家へ行くことに。
義父実家には、義父の兄一家とダンナの従兄一家が住んでいる。
年始のご挨拶に伺う。

いつも義父実家へは、車で出かけていた。
・・・が、今回は気分を変えて電車で行ってみることにした。
義父実家前には、線路がある。
駅もそんなに遠くはない。
しかし、その線には廃線の噂があった。
『廃線前に乗れるといいな』とか、『廃線になっていても、なんとかなるだろう』なんてお気楽気分ででかけてみると・・・。

本当に廃線になっている。



でもまぁ、バスがあるから・・・とバス停へ行くと

40分待ち



田舎の交通網は侮れないものだ。
もう、電車で行くことはないだろう。