[Delphi:91245] InterBase Expressで接続を維持するには

141 views
Skip to first unread message

auc...@yyclub.ath.cx

unread,
Mar 28, 2009, 1:28:17 PM3/28/09
to Del...@ml.users.gr.jp
Delphiを始めたばかりのじろうともうします。

かなり的外れな質問かもしれませんが、皆様よろしくお願いいたします。


当初、DBにはMSACCESSを使用し、ADOにて接続を行っておりました。

・データ件数が増加した場合のパフォーマンス
・スレッド処理による同時書込発生時のDBの安全性

などの懸念から、DBをFireBirdに移行することにしてみました。

ACCESSで行っていたことは
フォームにADOConnectionとADOQueryを二つ配置し、
起動時にデータ一覧表示のため、ADOQuery1のSQLにSELECT文を発行して表示。
データ登録のため、別のADOQuery2にINSERT文を発行。

以下データ登録を繰り返しても、起動時に開いたADOQuery1はデータ一覧を希望
通り表示したままでした。


移行にあたり、動作確認をおこなったところ、
フォームにIBDatabaseとIBTransactionをIBQueryを二つ配置し、同じ処理を行い
ましたが、FireBirdでは、Query2にてINSERT文を発行すると、Query1で開いてい
るデータ一覧の表が閉じてしまいます。


閉じた後にOpenすれば再度表示されますが、バックグラウンドでINSERT文を発行
するため、データを参照していると、突然最初の行に戻されることになり全く使
えません・・・


なんとかして、ADOのように接続を維持することはできないでしょうか?


よろしくお願いいたします。

太田 寛

unread,
Mar 28, 2009, 6:48:50 PM3/28/09
to Del...@ml.users.gr.jp
> フォームにIBDatabaseとIBTransactionをIBQueryを二つ配置し、同じ処理を行い
> ましたが、FireBirdでは、Query2にてINSERT文を発行すると、Query1で開いてい
> るデータ一覧の表が閉じてしまいます。
>
>
> 閉じた後にOpenすれば再度表示されますが、バックグラウンドでINSERT文を発行
> するため、データを参照していると、突然最初の行に戻されることになり全く使
> えません・・・
TBookmarkで位置を覚えていたら元のレコードに戻れます。

IBを使っていますが、閉じることはありませんよ。

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


横井 嘉邦

unread,
Mar 28, 2009, 10:24:12 PM3/28/09
to Del...@ml.users.gr.jp

横井です。


> フォームにIBDatabaseとIBTransactionをIBQueryを二つ配置し、同じ処理を行い
> ましたが、FireBirdでは、Query2にてINSERT文を発行すると、Query1で開いてい
> るデータ一覧の表が閉じてしまいます。

データペースに対して、登録を行う場合、Transaction.commitを使いますが。
(Commitは自動的に発行されているかもしれません)
これを行うと、同一のIBTrnsactionを参照しているDatasetが閉じてしまいます。

閉じないようにするには、次の方法が考えられます。

方法その1
Transaction.CommitRetainを使う。(Commit後もDatasetは、閉じません)

方法その2
IBDatabaseは一つでいいのですが、IBTransactionをIBQueryに1対1で対応させ

IBQueryの数だけIBTransactionを配置します。
そうすると、Transactionが別々になりますので、他のDatasetに影響しなくなります。


複数のIBQueryにマスタ/ディテールの関係がないのであれば、
その2の方法がお勧めだと思います。


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

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

auc...@yyclub.ath.cx

unread,
Mar 29, 2009, 7:05:35 AM3/29/09
to Del...@ml.users.gr.jp
太田さん、横井さん
有難うございました。

> TBookmarkで位置を覚えていたら元のレコードに戻れます。
こういうのもあるののですね。
勉強になります。

> データペースに対して、登録を行う場合、Transaction.commitを使いますが。
> (Commitは自動的に発行されているかもしれません)
> これを行うと、同一のIBTrnsactionを参照しているDatasetが閉じてしまいま
す。
>

まさにこの状態と思います。
やはりそうなんですね。

> 閉じないようにするには、次の方法が考えられます。
>
> 方法その1
> Transaction.CommitRetainを使う。(Commit後もDatasetは、閉じません)
>
> 方法その2
> IBDatabaseは一つでいいのですが、IBTransactionをIBQueryに1対1で対応さ

>
> IBQueryの数だけIBTransactionを配置します。
> そうすると、Transactionが別々になりますので、他のDatasetに影響しなくな
ります。
>
>
> 複数のIBQueryにマスタ/ディテールの関係がないのであれば、
> その2の方法がお勧めだと思います。
>

できました。
有難うございました。


横井 嘉邦 <yo...@wise.bz>さん:
>
> 横井です。
>
>
> > フォームにIBDatabaseとIBTransactionをIBQueryを二つ配置し、同じ処理を
行い
> > ましたが、FireBirdでは、Query2にてINSERT文を発行すると、Query1で開い

Reply all
Reply to author
Forward
0 new messages