keikoさんからの続きなのですが
具体的なコードは
procedure TForm1.Button1Click(Sender: TObject);
begin
query1.ApplyUpdates;
query1.Delete;
form1.Refresh;
end;
です。
SQLは
delete from TEST where EmpNo = 8
です。
このSQLでは一番上のレコードが削除しまいます。
また実際のデータベースACCESSでは、それすら削除されていません。
基本的なことだと思いますが、使い始めたばかりなので、できれば詳しくお願いしたいのですが。
やりたいことをコードにできていないようです。
query1.ApplyUpdates;
// キャッシュのアップデート。Open,ExecSQLしていないと意味がありません
query1.Delete;
// アクティブレコードの削除
form1.Refresh;
// フォームの再描画
プロパティに設定してあるSQLを実行するのであれば、
query1.ExecSQL; // SQLの実行
query1.ApplyUpdates;//キャッシュ更新
だと思いますが、どうでしょう。
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.Close;
Query1.ExecSQL;
Query1.ApplyUpdates;
end;
参考にさせていただき、コードを書いてみたのですが
「Query1:データセットが編集または挿入モードではありません」
というエラーが出てしまいます。
どこが悪いのでしょうか?
また、UpdateSQLのdelete、insert、modifyの使い分けはどうするのかも
わかりません。(上のコード中で)
お願いします。
UpdateSQLとは、TUpdateSQLコンポーネントのことですよね?
ひとまずこれは考えない方がよいです。
もし必要なら、
http://forum.nifty.com/fdelphi/samples/00886.html
ここにサンプルがあります。
ApplyUpdatesはいらないみたいです。
こちらでテストしてみたところ、
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.SQL.Clear;
Query1.SQL.Add('DELETE FROM test WHERE ID>=3');
Query1.ExecSQL;
end;
こんな感じでOKでした。
後は、他のDBコンポーネントの設定や、DBの種類によって違うかもしれません。
TUpdateSQLのリンク元を操作します。Closeしていては編集モードになりません。
TQueryのDataSetの対して行います。
書いている途中で登録されてしまいました。
TQueryに対して,Deleteをして、
Query1.Delete;
Closeする前にAppliUpdateをかけます。
にしの様ありがとうございます。
同じようにコードしたのですが下のような
警告が出ました。
デバッガ例外が発生
プロジェクトProject1.exeがEDBEngineErrorクラスの例外を生成しました。
’キー違反です。
[Microsoft][ODBC Microsoft Access Driver]リレーションシップが
設定されたレコードがテーブル'orders'
にあるので、レコードの削除や変更を行うことはできません。’
書いてある意味すら理解できません。
何度も申し訳ないのですが、よろしくお願いします。
TQueryのDeleteメソッドは、TDataSetのDeleteメソッドですよね?
これはアクティブレコードの削除だと思ったのですが、SQLを実行した際の対象レコードすべての削除になるんでしょうか。
DELETE FROM TEST ID > 3
の場合、
ID=3,ID=4,ID=5...もDeleteで消えます??
現在Form上には、TQueryとTUpdateSQLとTDataSourceとTDBGridとTButtonを貼り付けています。これではできないのでしょうか?
アクティブレコードだけの削除になっていました。
コードを
Query1.SQL.Clear;
Query1.SQL.Add('DELETE FROM test WHERE ID=8');
Query1.ExecSQL;
に変更したところ
{デバッガ例外が発生}
「「プロジェクトProject1.exeがEDBEngineErrorクラスの例外を生成しました。
’キー違反です。
[Microsoft][ODBC Microsoft Access Driver]リレーションシップが
設定されたレコードがテーブル'orders'
にあるので、レコードの削除や変更を行うことはできません。’」」
というエラーが出てしまいました。
長くなってしまいましたが、お願いします。
TQueryとTUpdateSQLが連結されていますので、Query1のSQLを変更すると、整合性がなくなり、エラーになります。この場合は、別にTQueryを配置し、Query2のSQLにDelete文を書き、ExecSQLを発行します。その後で、Query1をリフレッシュして読み直します。
ありがとうございました。
ツイート | ![]() |