Delphi と戯れる
2001年2月12日コメント (1) 8時頃に起きる。
起きて早速「かえるにょ国にょアリス」をする。
しばらくして朝ご飯。
白菜を煮て、「うまかっちゃん」を煮て食べる。
お腹がはったので一眠り。
起きて、Delphi のお勉強。
Delphi から ADO を使って DB に接続するところまでは
できていたので、今度は実際にデータを取りに行く。
ADO の Connection Object の Execute Method を使って、
Recordset を取得し・・・ようとしたら、
「TRecordset と _Recordset は互換性が無い」という旨の
コンパイルエラー。
TRecordset の Property や Method で、
_Recordset型の引数を持つ Object を探すと、
ConnectTo という Method が見つかった。
とりあえず、その Method を使ってみる。
こんどは 「TRecordset には Fields Property が無い」という旨のエラー。
あら〜? よくわからないが、
DefaultInterface プロパティを介してアクセスできた。
で、コンパイル〜〜通った。
で、実行・・・あれれ? 接続がうまくいかない。
昨日は ’’ (空文字列) にしていたところを EmptyParam に
変えていたためだった。
よくわからずにつかうもんじゃないなぁ・・・。
で、VB ならば省略できる引数をなんらかの引数で
きちんと埋める形にして実行。
接続はできた。が、テーブルにアクセスする権限が無い?
相手は Access2000 の DB だそ??
試しに、VBS で同じことをしてみると・・・同じエラーがでた。
NaruTo の父の会社の業務システムに Access の DB を使っているが、
これには Workgroup を使ってセキュリティ設定をしている。
これを設定している機械では、どの Access の DB を開くにも
ユーザー名とパスワードが必要になる。
ただし、セキュリティ設定していない DB は
他の機械に持っていくと開けるが。
で、ADO での接続時の接続文字列で、
この Workgroup の情報を指定しないと接続ができないらしい。
しかし、普通は Workgroup を指定する必要が無いので
指定したくない。
調べると、Access起動時には Workgroup File を明示的に指定できるので、
父の会社の業務システムのファイルを開くときだけ、
Workgroup File を指定するようにショートカットを用意した。
で、共通の Workgroup File を Office Install時のものに戻した。
すると、Access の起動時にはユーザー名を聞いてこないようになった。
・・・しかし、VBS からは同じく権限が無いというエラーがでる。
開けない。一旦消してみる。
で、Access を起動すると、Office が修復インストールを始めた。
修復が終わって、再度 VBS からテーブルを読み取ろうとしたら、
やっぱり、権限が無いとでる。
問題の DB をAccess で開き、Scurity Wizard で
セキュリティの設定をしなおそうとしたら権限が無く、
設定したければ新しく Access の DB を作って Object を
Import しろとでた。そのようにして、で、
Scurity Wizard で Scurity 設定をしかけて・・・やめ、
先の VBS でテーブルを読みに行く。
・・・今度はうまくいった。で、Delphi からも接続できた。
で、今度は TRecordset型の変数を用いていたところを、
Recordset型の変数に変えて試して見た。
TRecordset型を用いていると、
初期化されていない場合があるという警告がでるため。
・・・いや、実際初期化してないんで初期化しないといけないのだけど。
でも、既にインスタンス化されているオブジェクトを参照するだけだから、
どうもピンとこなかった。で、 Recordset型ならば
Connection Object の Execute Method を
そのまま受け取ることができ、
プロパティにそのまま Fields を持っている。
で、やってみたら動いた。が、・・・ええんかいな?
今度は Recordset Object の Open Method を使ってみる。
今度は TRecordset を Create して、
TRecordset の DefaultInterface を介して Open。
ActiveConnection の引数には TConnection 型ではなく、
_Connection 型の値を渡さなければならなかった。
で、テーブルの値は参照できた。
で、疑問。なんで、いちいち DefaultInterface を
参照しないといけないんだ?
ADO のタイプライブラリを読み込んで
生成されたコードを調べてみる。
Recordset Object の Open Method の
ActiveConnection みたいに、
他の Object を引数に取るところは他のところも
OleVariant型になっていて、
使うときには DefaultInterface を
呼び出す必要があるようだった。
しかし、Recordset でいちいち DefaultInterface を
呼び出さなきゃならないのはどうも Code Generator の
Bug の様である。実際、Connection型の
Wrapper Class の TConnection や、
Record型の Wrapper の TRecord は
中のインターフェースに委譲する一連のメソッドを持っているが、
Recordset だけ、欠落しているのである。
うぅむ・・・。
ひと区切りつけて、晩ご飯の買い出し。
晩ご飯用に豆腐とチキンボールを買った。
そして、買い置きように冷凍うどんと
話題の「そばめし」を買った。
インスタントのいりこだしで
白菜とチキンボールと豆腐を煮て食べた。
それからもうしばらく Delphi と格闘。
テーブルの内容を ListBox に Dump するものを作ってみた。
で、今日はおしまい。
う〜ん、本当は ClassFactory の張りぼてづくりまで
行きたかったんだが・・・。
で、日記を書きはじめる。
日記を書いて復習をしながら気がついた点をもう一度確かめたりする。
Connection Object の Execute Method で _Recordset Interface を
取得するときの取り扱いはあらかじめ
TRecordset Object をインスタンス化しておいて
ConnectTo で TRecordset に _Recordset Interface を割り当てるのが
正しいやり方のようだな。
で、日記を書いて今日はおしまい。
明日の準備をして風呂に入って寝よう。
・・・今日作った練習プログラムを、
家に持って帰ってきているノートパソコンに複写する際に、
キーボードに当たってうっかりフォルダを一つ消した可能性がある。
(改行キーを押そうとして、Deleteキーにも当たった。
で、なんかダイアログが一瞬出ていた)
可能性だけで、実際に消したがわからないが・・・。
大事なふぁいるでなかったらいいのだけど・・・・。
とりあえず、Backup をとっておこう。
起きて早速「かえるにょ国にょアリス」をする。
しばらくして朝ご飯。
白菜を煮て、「うまかっちゃん」を煮て食べる。
お腹がはったので一眠り。
起きて、Delphi のお勉強。
Delphi から ADO を使って DB に接続するところまでは
できていたので、今度は実際にデータを取りに行く。
ADO の Connection Object の Execute Method を使って、
Recordset を取得し・・・ようとしたら、
「TRecordset と _Recordset は互換性が無い」という旨の
コンパイルエラー。
TRecordset の Property や Method で、
_Recordset型の引数を持つ Object を探すと、
ConnectTo という Method が見つかった。
とりあえず、その Method を使ってみる。
こんどは 「TRecordset には Fields Property が無い」という旨のエラー。
あら〜? よくわからないが、
DefaultInterface プロパティを介してアクセスできた。
で、コンパイル〜〜通った。
で、実行・・・あれれ? 接続がうまくいかない。
昨日は ’’ (空文字列) にしていたところを EmptyParam に
変えていたためだった。
よくわからずにつかうもんじゃないなぁ・・・。
で、VB ならば省略できる引数をなんらかの引数で
きちんと埋める形にして実行。
接続はできた。が、テーブルにアクセスする権限が無い?
相手は Access2000 の DB だそ??
試しに、VBS で同じことをしてみると・・・同じエラーがでた。
NaruTo の父の会社の業務システムに Access の DB を使っているが、
これには Workgroup を使ってセキュリティ設定をしている。
これを設定している機械では、どの Access の DB を開くにも
ユーザー名とパスワードが必要になる。
ただし、セキュリティ設定していない DB は
他の機械に持っていくと開けるが。
で、ADO での接続時の接続文字列で、
この Workgroup の情報を指定しないと接続ができないらしい。
しかし、普通は Workgroup を指定する必要が無いので
指定したくない。
調べると、Access起動時には Workgroup File を明示的に指定できるので、
父の会社の業務システムのファイルを開くときだけ、
Workgroup File を指定するようにショートカットを用意した。
で、共通の Workgroup File を Office Install時のものに戻した。
すると、Access の起動時にはユーザー名を聞いてこないようになった。
・・・しかし、VBS からは同じく権限が無いというエラーがでる。
開けない。一旦消してみる。
で、Access を起動すると、Office が修復インストールを始めた。
修復が終わって、再度 VBS からテーブルを読み取ろうとしたら、
やっぱり、権限が無いとでる。
問題の DB をAccess で開き、Scurity Wizard で
セキュリティの設定をしなおそうとしたら権限が無く、
設定したければ新しく Access の DB を作って Object を
Import しろとでた。そのようにして、で、
Scurity Wizard で Scurity 設定をしかけて・・・やめ、
先の VBS でテーブルを読みに行く。
・・・今度はうまくいった。で、Delphi からも接続できた。
で、今度は TRecordset型の変数を用いていたところを、
Recordset型の変数に変えて試して見た。
TRecordset型を用いていると、
初期化されていない場合があるという警告がでるため。
・・・いや、実際初期化してないんで初期化しないといけないのだけど。
でも、既にインスタンス化されているオブジェクトを参照するだけだから、
どうもピンとこなかった。で、 Recordset型ならば
Connection Object の Execute Method を
そのまま受け取ることができ、
プロパティにそのまま Fields を持っている。
で、やってみたら動いた。が、・・・ええんかいな?
今度は Recordset Object の Open Method を使ってみる。
今度は TRecordset を Create して、
TRecordset の DefaultInterface を介して Open。
ActiveConnection の引数には TConnection 型ではなく、
_Connection 型の値を渡さなければならなかった。
で、テーブルの値は参照できた。
で、疑問。なんで、いちいち DefaultInterface を
参照しないといけないんだ?
ADO のタイプライブラリを読み込んで
生成されたコードを調べてみる。
Recordset Object の Open Method の
ActiveConnection みたいに、
他の Object を引数に取るところは他のところも
OleVariant型になっていて、
使うときには DefaultInterface を
呼び出す必要があるようだった。
しかし、Recordset でいちいち DefaultInterface を
呼び出さなきゃならないのはどうも Code Generator の
Bug の様である。実際、Connection型の
Wrapper Class の TConnection や、
Record型の Wrapper の TRecord は
中のインターフェースに委譲する一連のメソッドを持っているが、
Recordset だけ、欠落しているのである。
うぅむ・・・。
ひと区切りつけて、晩ご飯の買い出し。
晩ご飯用に豆腐とチキンボールを買った。
そして、買い置きように冷凍うどんと
話題の「そばめし」を買った。
インスタントのいりこだしで
白菜とチキンボールと豆腐を煮て食べた。
それからもうしばらく Delphi と格闘。
テーブルの内容を ListBox に Dump するものを作ってみた。
で、今日はおしまい。
う〜ん、本当は ClassFactory の張りぼてづくりまで
行きたかったんだが・・・。
で、日記を書きはじめる。
日記を書いて復習をしながら気がついた点をもう一度確かめたりする。
Connection Object の Execute Method で _Recordset Interface を
取得するときの取り扱いはあらかじめ
TRecordset Object をインスタンス化しておいて
ConnectTo で TRecordset に _Recordset Interface を割り当てるのが
正しいやり方のようだな。
で、日記を書いて今日はおしまい。
明日の準備をして風呂に入って寝よう。
・・・今日作った練習プログラムを、
家に持って帰ってきているノートパソコンに複写する際に、
キーボードに当たってうっかりフォルダを一つ消した可能性がある。
(改行キーを押そうとして、Deleteキーにも当たった。
で、なんかダイアログが一瞬出ていた)
可能性だけで、実際に消したがわからないが・・・。
大事なふぁいるでなかったらいいのだけど・・・・。
とりあえず、Backup をとっておこう。
コメント
こっちにもリンクつけときますね〜
http://www.miko.org/~naruto/Artifact/Delphi_ADO_sample.html