[Delphi:90850] Delphi7からのOracle接続について

1,499 views
Skip to first unread message

delphiml

unread,
Nov 4, 2008, 2:56:48 AM11/4/08
to Del...@ml.users.gr.jp
お世話になっております。岸本と申します。

現在、Delphi7+BDE+Firebirdの構成でDBアプリケーションを運用しています。
この度、DBをOracle10gに変更するためBDEをやめて他のコンポーネントで
Oracle10gに接続しようと考えています。
1年ほど前にこのコミュニティでDirect Oracle Accessというコンポーネントが
紹介されていましたが、使い勝手はどうなのでしょうか?
http://zope.teppi.com/Components/DOA

今はTTable,TQueryを多用しており、DBGridやDBEditといった表示コンポーネントも
使用しています。また、アプリケーションの数も20ほどあるため、出来れば変更箇所
は最小限に抑えたいと考えています。
本当は無償のコンポーネントがあればいいのですが。。。

みなさんはOracleにどういう技術(ADOやコンポーネントなど)を使って
接続しておられますか?
参考にしたいと思いますので、みなさんのご意見をお聞かせください。
よろしくお願いいたします。


高井 繁雄

unread,
Nov 4, 2008, 3:20:09 AM11/4/08
to Del...@ml.users.gr.jp
岸本様

高井です。
お世話になっております。

>> みなさんはOracleにどういう技術(ADOやコンポーネントなど)を使って
>> 接続しておられますか?

私はOracle10gでは、OO4Oを使用したことがあります。
他の接続方法は、使ったことが無いので比較は出来ませんが。

OO4Oについては、こちらのHPが参考になりました。
http://homepage1.nifty.com/project21/articles/delphi/tips_oracle.htm

OO4OはOracleに標準添付しているので、マニュアルも付いていると
思います。

takashi

unread,
Nov 4, 2008, 3:44:21 AM11/4/08
to Del...@ml.users.gr.jp
以前は BDE や dbExpress で開発していましたが
最近はDelphi6 + ADO ( dbGo ) で開発しています。
dbGoは Delphi2009 Pro でも対応していると思います。
注意点は Del6 の場合公式パッチだけだとマイナス表示できない
のでソース変更の必要性があります。

あとロックを行う場合は トランザクション制御をかけないと
ほぼ100%エラー発生します。
ADOを利用していれば、多少の変更で他DBにも移植できるので
便利だと思います。

--
takashi <taka...@csjpn.com>


delphiml

unread,
Nov 4, 2008, 11:12:52 PM11/4/08
to Del...@ml.users.gr.jp
こんにちは、岸本です。

有用な情報ありがとうございました。

いずれにしても、今までTTableコンポーネントに依存してきましたので、
載せかえが大変です^^;
将来的にはすべて変更することにしますが、アプリの数が数だけに、
BDEでOracle接続できるものはしばらくそれで我慢して、どうしても無理
なものは、変更していきたいと思います。
まあ、BDE+Oracle10gでどういう不具合があるか怖いところもありますが・・・^^;


Tomomi Umezawa

unread,
Nov 4, 2008, 11:31:58 PM11/4/08
to Del...@ml.users.gr.jp
こんにちは、梅澤@プロキャストです。

使用方法が異なるので、あまり参考にならないと思いますが...

3年ほど前に、
DOA 4 + Delphi 5 (ターゲットOSはWin2000)
でプログラムを作り納品しました。

少し前の案件なので、細かいところは忘れてしまいましたが、特に悩むような
ところもなく使用できました。
ただし、TTable系は使用していません。
TQuery系のコンポを使っています。

また、グリッドはDB系のグリッドを使わずに、TMS社のTAdvStringGridに自分で
値を書き込んでいます。

(ちなみに、私は普段あまりDBが絡むようなプログラムをしません。
いままで使った事があるのは、
DBISAM
Oracle 8i + DOA
Firebird 2.0 + FibPlus (Devrace社)
SQL Server + SDAC32 (Devart社。旧Core Lab社)
です。
Oracle案件以外は小規模システムであり、DBの種類はこちらで決定出来る
ので、割とDBにダイレクトにアクセスするタイプのものを使っています。)

コンポを決める際、OO4Oも候補でしたが、私も鉄飛テクノロジーさんのページ
を見て、DOAを試してみたところ、楽に扱えそうだったので、DOAにしました。


delphiml さんは書きました。< Tue, 4 Nov 2008 16:56:48 +0900 >

----------
Tomomi Umezawa um...@procast.co.jp


太田 寛

unread,
Nov 5, 2008, 4:18:07 PM11/5/08
to Del...@ml.users.gr.jp
delphiml さん

DOAはBDEからの変更は少ないと思います。
ただ、RDBMSを使う場合は、TTableはやめた方が良いと思います。

標準ならdbExpressですね。こちらだと動作はかなり速いようです。
RDBMSの場合は、結構重要なファクターになります。

〒760-0080 香川県高松市木太町1730-17
瀬戸電測有限会社
太田寛
TEL 087-834-5635
FAX 087-816-0007


delphiml

unread,
Nov 5, 2008, 6:47:18 PM11/5/08
to Del...@ml.users.gr.jp
梅澤さん、太田さん、ご回答ありがとうございます。

どうしても、Firebird→Oracleの開始時期が決まってますので、
手間をかけずにリメイクとなるとDOAが良いかもしれませんね!
あまりスキルがない私にも出来そうなので・・・^^;

今までもdbExpressへの移行を何度か考えたのですが、
パフォーマンス的に特に問題はなかったので、行いませんでした。
これを機会に徐々に変更していきたいと思います。

岸本


Masaki Umemura

unread,
Nov 5, 2008, 11:19:19 PM11/5/08
to Del...@ml.users.gr.jp
こんにちは。梅村です。

私も岸本さんと同じ Delphi7 + Oracle10g です。
機会があれば BDE から ADO に移行していますが BDE のままの
アプリケーションもまだ多くあります。

参考までに ADO について気づいた点を覚えている範囲で...

・TTable で更新をするとエラーになることがある。
Oracle が内部で持っている RowId が原因だったと思います。
(BDE が未対応なのでしょうがない?)

・パラメータの書き方が BDE と違う。

・固定長の文字列フィールドの扱いが BDE と違う。
詳細は忘れてしまいました。
パラメータの設定のときだったかな?

・Delphi 開発環境が終了できないことがある。
エラーが繰り返し表示されることがあります。
強制終了でとりあえず回避しています。

・ADO の方が速い?
何万件も更新処理するバッチ処理では ADO が断然速かったです。
___________________________________________________
梅村 正喜

Masaki Umemura

unread,
Nov 5, 2008, 11:48:16 PM11/5/08
to Del...@ml.users.gr.jp
梅村です。
ちょっと誤解されそうな書き方でしたので...

私:


> ・TTable で更新をするとエラーになることがある。
> Oracle が内部で持っている RowId が原因だったと思います。
> (BDE が未対応なのでしょうがない?)

これは BDE の話です。
TADOTable は使ったことがありませんです。

> ・Delphi 開発環境が終了できないことがある。
> エラーが繰り返し表示されることがあります。
> 強制終了でとりあえず回避しています。

これは ADO の話です。
アプリケーション自体は大丈夫です。
___________________________________________________
梅村 正喜


delphiml

unread,
Nov 6, 2008, 1:19:09 AM11/6/08
to Del...@ml.users.gr.jp
梅村さん、ありがとうございます。

> ・TTable で更新をするとエラーになることがある。
> Oracle が内部で持っている RowId が原因だったと思います。
> (BDE が未対応なのでしょうがない?)
>

> ・パラメータの書き方が BDE と違う。

TTableのエラーやTQueryでのSQL文の違いについては、ひとつひとつ
つぶしていかないといけないですね。。。
それより、本来正常でないデータの書き込みや変更などが、エラーを出さずに
暗黙的に処理されてしまうようなことがないか不安です。

>
> ・固定長の文字列フィールドの扱いが BDE と違う。
> 詳細は忘れてしまいました。
> パラメータの設定のときだったかな?

文字列フィールドの扱いが違うのは確認しました。
長い文字列フィールドはBDEからはメモ型(BLOB)として認識してしまいますね。
なので、試しにFirebirdのテーブルデータをDatabase Desktopを使ってOracle
テーブルにInsertしてみましたが、型違いのエラーがでたのでSQL*Loaderで
コピーしました。あと、DBGridからもメモになってしまい表示できませんでした。

岸本


delphiml

unread,
Nov 13, 2008, 7:55:51 AM11/13/08
to Del...@ml.users.gr.jp
お世話になります。岸本です。

あれから、FirebirdからOracle10gへのデータ移行を行っていますが、
やはり互換性の影響で不思議な現象に襲われています。
その度に何とか工夫して逃げていますが、ひとつ回避できない
問題があります。

それは、OracleDBに作成したテーブルをBDE経由で接続し、その後で
列名を変更したり文字列のサイズを変更し、そして同じくBDE経由で
接続した際に、その変更が反映されないという不具合です。
反映されてないので、SQLエクスプローラで見ると列名が以前のまま
だったりとか、DatabaseDesktopなどで問い合わせをしようとすると、
そんな列名は存在しない!とエラーが出ます。

しかしそれはBDEを介した時だけで、SQL*Plusなどのツールからは
きちんと変更されています。
試しに他のPCからBDE経由で接続してみると変更された状態で表示
れたので、私が使用しているPCのBDEが原因だと思い、一度、関連する
BDEファイルを削除したりしましたが、直りませんでした。
最終的にはOSの再インストールをすると正常に見ることができました。

そうなることは仕方がないと思いますが、テーブル構造を変更するたびに
OSの再インストールをしていてはたまりませんので、接続情報をリセット
できる方法(接続情報を格納しているファイル)を探しているのですが
よくわかりません。

ご経験のある方、また対応方法のご存知の方がおられましたら、
教えてください。


Masaki Umemura

unread,
Nov 13, 2008, 8:51:07 PM11/13/08
to Del...@ml.users.gr.jp
こんにちは。梅村です。
解決策ではありませんので参考までに...

岸本さん:


> それは、OracleDBに作成したテーブルをBDE経由で接続し、その後で
> 列名を変更したり文字列のサイズを変更し、そして同じくBDE経由で
> 接続した際に、その変更が反映されないという不具合です。

私も Delphi7 + Oracle10g です。
BDE も Native 接続で使っています。

私はフィールドを変更してもこのような現象に見舞われたことが
ありません。
(Delphi のソースに列情報を格納した場合は別です。
この場合は一旦削除して列情報を作り直しています)
___________________________________________________
梅村 正喜

jun

unread,
Nov 13, 2008, 9:17:16 PM11/13/08
to Del...@ml.users.gr.jp
しばじゅんこです。

C++Builder8使用者ですが、BDEは一旦ファイルをオープンすると
フィールド情報を確保するみたいで、他でファイル情報を変えても
アプリを起動しっぱなしでは次にCloseオープンしても反映されません。
(TDatabaseの破棄、作成まではしていません(ここまですれば即座に反映されるかも))

(当方はTDatabase、TQueryとかで接続)

私は1度アプリを終了させています。これなら何ともなくOKです。

>れたので、私が使用しているPCのBDEが原因だと思い、一度、関連する
>BDEファイルを削除したりしましたが、直りませんでした。
>最終的にはOSの再インストールをすると正常に見ることができました。

こういうことまではありませんです。

takashi

unread,
Nov 13, 2008, 9:32:39 PM11/13/08
to Del...@ml.users.gr.jp
そもそも BDE を使うこと自体が間違っていると思います。

開発を進めていくと他にも問題とか出てくると思います。
BDE は開発中止だし、ORACLE にしても今頃 10g か疑問です。

10g も R1 は色々と問題持っていました。
(R2以降は大きな問題は知りませんが)


せっかく新しいものを作るなら BDE を捨てる事を
考えてみたらいかがでしょう


--
takashi <taka...@csjpn.com>


delphiml

unread,
Nov 14, 2008, 3:04:23 AM11/14/08
to Del...@ml.users.gr.jp
ご回答ありがとうございます。岸本です。

ちょっと試してみました。
BDEアプリとOracleDBの接続を切った状態で、あるテーブルをSQL*Plus
で削除した後に、再度SQL*Plusで作成します。それをDatabaseDesktopで
参照すると「テーブルを開く」ダイアログボックスにはそのテーブルが表示
されているのですが、開くと”テーブルは存在しません!”とエラーが出ます。
BDEはCREATE TABLEを認識していない・・・?
次にDatabaseDesktopでそのテーブルを削除し、同じくSQL*Plusで再度
テーブルを作成してからDatabaseDesktopで開くと正常に開きます。
どうしてこうなるのかよくわからないですが、逃げ道はあるようです。

>そもそも BDE を使うこと自体が間違っていると思います。

>開発を進めていくと他にも問題とか出てくると思います。
>BDE は開発中止だし、ORACLE にしても今頃 10g か疑問です。

おっしゃる通りです。今回はDBをFirebirdからOracleに変更するのに伴い
脱BDEをしようと考えています。しかしながら、一度にDB入れ替えと
アプリ変更をする時間的余裕がないために、とりあえず今回は
OracleDB+BDEとし、最低限のアプリ変更で済ませようと思っています。
今後は徐々にBDEを利用しないアプリに変更して行こうと思っています。

太田 寛

unread,
Nov 14, 2008, 3:17:55 AM11/14/08
to Del...@ml.users.gr.jp
delphiml さん

>> そもそも BDE を使うこと自体が間違っていると思います。

これは、テーブル構造を変更するのに、BDEを通してプログラムから変更するこ
とがおかしいと言っているのだと思います。
列名を変更したり文字列のサイズを変更するのは、SQL*Plusなどで変更するべき
です。
また、BDEは対象がOracle 8.1.7 までです。
Oracleをバージョンアップするのに、プログラム側も同様に変更が必要になる事
を説明しましょう。

delphiml

unread,
Nov 14, 2008, 3:26:23 AM11/14/08
to Del...@ml.users.gr.jp
太田さん、ありがとうございます。

そういう意味でしたか^^;

> これは、テーブル構造を変更するのに、BDEを通してプログラムから変更するこ
> とがおかしいと言っているのだと思います。
> 列名を変更したり文字列のサイズを変更するのは、SQL*Plusなどで変更するべき
> です。

テーブル構造の変更や削除、作成はすべてSQL*Plusまたは
システムインテグレータ社のSI ObjectBrowserで行っています。

岸本


takashi

unread,
Nov 14, 2008, 3:56:28 AM11/14/08
to Del...@ml.users.gr.jp
> おっしゃる通りです。今回はDBをFirebirdからOracleに変更するのに伴い
> 脱BDEをしようと考えています。しかしながら、一度にDB入れ替えと
> アプリ変更をする時間的余裕がないために、とりあえず今回は
> OracleDB+BDEとし、最低限のアプリ変更で済ませようと思っています。
> 今後は徐々にBDEを利用しないアプリに変更して行こうと思っています。

もうかなり前の話なのですが、Oracle7 + BDE を Oracle8 に変更しよう
としたとき苦労しました。TTable はデバッグでデータ件数が少ないと
問題ないのに、客先でデータ件数が多いとエラーになったり色々と恐ろしい
事が起きて結局 TQuery に書き換えた覚えがあります。

BDEは接続時に情報を取り込むみたいです。DBGridなどは列名を取り込むと
プログラムを終了しても、メモリに残っているBDEが持っている情報が
悪さをするようです。この場合は電源を1度切らないと駄目でした。

それ以来、TTable や DBGrid は使わないようにしています。

一時 DBExpress も使ってみましたが、ORACLE のバージョンアップ
に対応してくれなかったので、現在は ADO を使っています。
もっとも最近き .NET が主流ですが、

--
takashi <taka...@csjpn.com>


横井 嘉邦

unread,
Nov 14, 2008, 8:16:53 AM11/14/08
to Del...@ml.users.gr.jp
岸本さま

横井といいます。

昔Oracleを使っていたことがあります。

コントロールパネルにあるBDE Administraotrの設定の中で、
ドライバーがOracleの場合、enable schema cacheという
設定があります。

確か、これがTrueの場合、最初にテーブルを開くと、その構造をスキーマ用
のファイル(たしか拡張子が.scmとかだったと思います。自信ない)に
保存して、2回目以降はそのファイルを参照するようになります。
そうすると、岸本さんの言われている現象が起きました。

この場合は、
スキーマファイルを削除して、必要なら設定をFalseにすれば解決します。

これに該当するということはありませんか。

ほかにも、"schema cashe"がつく、設定を変更しておられるのであれば、
その辺があやしいと思います。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
E-Mail: yo...@wise.bz ///// 横 井 嘉 邦 /////

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


COOK2

unread,
Nov 14, 2008, 11:49:51 PM11/14/08
to Del...@ml.users.gr.jp
COOK2です。
お世話になります。
はずしていたらすいません。
TTableとかだったら、右クリックメニューで「テーブルの定義を更新」を選択して
「項目の設定」を選択して、ウィンドウから一度列を削除して
再度項目を追加すれば直るということはありませんか。

はずしていたらすいません。


お世話になります。岸本です。

ご経験のある方、また対応方法のご存知の方がおられましたら、
教えてください。


--------------------------------------
Power up the Internet with Yahoo! Toolbar.
http://pr.mail.yahoo.co.jp/toolbar/

delphiml

unread,
Nov 16, 2008, 7:37:59 PM11/16/08
to Del...@ml.users.gr.jp
横井さま

ありがとうございます。岸本です。

横井さまの言われるように、BDE Administratorのエリアスの定義にある
ENABLE SCHEMA CACHEをFalseにすると変更が即座に反映されるよう
になりました。

その設定ファイルを探したのですが、見つけることはできませんでした。
しかし、どちらにしても、各クライアントPCの設定はFalseにしておかない
とならないと思うので、それで進めて行きたいと思います。

たいへん助かりました。ありがとうございました。


delphiml

unread,
Nov 16, 2008, 7:50:46 PM11/16/08
to Del...@ml.users.gr.jp
COOK2さま

ありがとうございます。岸本です。

すみません、まだDelphiをいじるところまでは行っておらず、
今はFirebirdからOracleへのデータ移行と検証を行っています。
データ移行では皆様のアドバイスにより何とか大きな問題はなさそう
ですので、これからDelphiで作成したアプリを変更していくつもりです。

以前にも書きましたが、本当は一足飛びに脱BDEをしたいのですが、
ちょっとボリュームが大きいので段階的にやっていく予定です。
ですので、そのアプリ変更の段階でまた質問するかもしれませんが、
その時はよろしくお願いいたします。

Reply all
Reply to author
Forward
0 new messages