IBQueryのApplyUpdateについて

解決


サンプー  2006-12-04 22:25:55  No: 24139

Dl6Pro,Xp,InterBaseを利用して、DB作成中です。過去に同じような質問をして、自己解決したつもりでしたが、またまた、同じ状況が出たので、再びの質問です
フォームにDBGrid,DBNavigator,Buttonを貼り付け、DBGrid,DBNavigatorにTIBQuery(DM009のデータモジュールユニット内)を適切にセットし、同じモジュール内にTIBUpDateSQL、TIBDatatBase,TIBTransactionを配置、TUpDateSQLはUpDateSQLの設定で行いました。
DBNavigatorでDBGrid内のデータを1行目から削除していき、閉じるbuttonを押すと更新されるのですが、DBGrid内のデータを末尾から削除し、閉じるボタンを押すと、'EIBClientErrorクラスの例外を発生しました
’更新失敗’になります
閉じるButtonのイベントには以下のように記述してあります。
また、TIBQueryのCashedUpDateはTrueにしています。

procedure TFrmSagyo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  If MessageDlg('終了しますか?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
    begin
     with DM009.IBQuerySagyoMas do
      begin
       Edit;
       Post;
       ApplyUpdates;
       Close;
       Open;
      end;
     Close;
    end
    else
    Abort;
end;


サンプー  2006-12-04 23:59:26  No: 24140

一つ、解ったことがあります

上の現象で、IBQueryをIBTableに変更して、夫々のプロパティを適切に変更後

procedure TFrmSagyo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  If MessageDlg('終了しますか?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
    begin
     with DM009.IBTable1 do
      begin
       Edit;
       Post;
       ApplyUpdates;
       Close;
       Open;
      end;
     Close;
    end
    else
    Abort;
として、実行すると、何ら不具合は出ません


えーとね  2006-12-05 10:36:52  No: 24141

> ’更新失敗’
IBUpdateSQL は1行のみ(RowsAffected =1)更新するように出来ているので
複数行を更新してしまうようなSQL を書いているとエラーになるそうです。

またストアド・プロシージャはRowsAffected を返さないので、エラーになるそうです。
IBUpdateSQL の代わりにIBDataset を使うと良いらしいです。


HOta  2006-12-05 16:05:34  No: 24142

Transactionはどうしていますか?

if DM009.IBQuerySagyoMas.Transaction.intransaction then
  DM009.IBQuerySagyoMas.Transaction.CommitRetaining;
を入れたらどうでしょうか?


サンプー  2006-12-05 20:49:48  No: 24143

えーとねさん、HOTAさん有難うございます
えーとねさんのアドバイスに従い、
>IBUpdateSQL の代わりにIBDataset を使うと良いらしいです。
IBDatasetを使い、各プロパティーを設定後、実行すると、上手くいきました
最後に、データベースへの登録を以下の方法で行いました
procedure TFrmSagyo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  If MessageDlg('終了しますか?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
    begin
       DM009.IBDatabase.ApplyUpdates([DM009.DataSource4.DataSet]);
     Close;
    end
    else
    Abort;
end;

HOTAさん
>Transactionはどうしていますか?
IBDataBaseとIBTransactionをデータモジュールにただ単に貼り付け、各プロパティーを設定しているだけです

えーとなさんの御指摘の
>IBUpdateSQL は1行のみ(RowsAffected =1)更新するように出来ているので
>複数行を更新してしまうようなSQL を書いているとエラーになるそうです。
とすると、IBUPDateQSLの使う場面が、今いちよく理解できません
この辺の情報は、どこから得れば良いのでしょうか?
ご存知でしたら、お願いします


えーとね  2006-12-05 21:30:55  No: 24144

> 今いちよく理解できません
内部処理は1行ずつ処理しているという意味だと思います。

> この辺の情報は、どこから得れば良いのでしょうか?
US ニューズグループから入手しました。
http://groups.google.co.jp/groups/dir?sel=33614731&hl=ja

IBX の責任者であるJeff Overcash さんの発言です。


えーとね  2006-12-05 21:50:00  No: 24145

IBQuery + IBUpdateSQL はIB ネイティブではないので
Int64 パラメータを使えない。ModifySQL の1行更新など
いろいろ制限があるようです。

IB ネイティブなIBDataSet を使った方が幸せなようです。


サンプー  2006-12-05 22:24:27  No: 24146

えーとねさん有難うございます
今後の勉強の参考にさせていただきます


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加