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;
一つ、解ったことがあります
上の現象で、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;
として、実行すると、何ら不具合は出ません
> ’更新失敗’
IBUpdateSQL は1行のみ(RowsAffected =1)更新するように出来ているので
複数行を更新してしまうようなSQL を書いているとエラーになるそうです。
またストアド・プロシージャはRowsAffected を返さないので、エラーになるそうです。
IBUpdateSQL の代わりにIBDataset を使うと良いらしいです。
Transactionはどうしていますか?
if DM009.IBQuerySagyoMas.Transaction.intransaction then
DM009.IBQuerySagyoMas.Transaction.CommitRetaining;
を入れたらどうでしょうか?
えーとねさん、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の使う場面が、今いちよく理解できません
この辺の情報は、どこから得れば良いのでしょうか?
ご存知でしたら、お願いします
> 今いちよく理解できません
内部処理は1行ずつ処理しているという意味だと思います。
> この辺の情報は、どこから得れば良いのでしょうか?
US ニューズグループから入手しました。
http://groups.google.co.jp/groups/dir?sel=33614731&hl=ja
IBX の責任者であるJeff Overcash さんの発言です。
IBQuery + IBUpdateSQL はIB ネイティブではないので
Int64 パラメータを使えない。ModifySQL の1行更新など
いろいろ制限があるようです。
IB ネイティブなIBDataSet を使った方が幸せなようです。
えーとねさん有難うございます
今後の勉強の参考にさせていただきます
ツイート | ![]() |