1

なぜこれが起こっているのかよくわからないので、状況を簡単に説明します (簡単に理解できるはずです)。

Form1 は、SQL 選択ステートメントを実行し、TDataSource コンポーネントを介して ADOQuery1 コンポーネントにリンクされた dbgrid に表示するプロシージャです。

procedure form1. Selectp;
begin
   ADOQuery1.Active:=false;
   ADOQuery1.SQL.Text:='select * from tbl';
   ADOQuery1.Active:=true;
end;

Form1 には、レコード フィールドに入力するための新しいフォームを開くボタンがあります。

procedure form1. buttonaddrecordClick(Sender: TObject);
var
form2:Tform;
begin
   form2:=Tform2.Create(nil); 
   try
      form2.ShowModal; 
   finally
      form2.Release; 
   end;
   selectp;//executes but new record doesn’t show up although in database;
end;

Form2 には、form2.ADOQuery2 を介してデータベースに値を挿入するプロシージャがあります。

procedure form2.Insertp;
begin
    ADOQuery2.Active:=false;
    ADOQuery2.SQL.Text:='insert into tbl (field1) values ('''+ sfield +''')';
    ADOQuery2.ExecSql;
    ModalResult := mrOk;
end;

form1 にボタンを配置して selectp を実行する場合、新しいレコードが表示されるまでに 2 回以上押す必要がありますが、buttonaddrecord で showmodal を実行した後に selectp を何回呼び出しても、新しいレコードは表示されません。

何が原因で、どうすれば修正できますか?

4

1 に答える 1

5

TDataSourceリンク先は、のユーザーが DB に変更を加えた ADOQuery1ことを知る方法がありません。 ADOQuery2

を介して新しい行を挿入したに呼び出します (これは、が続くのと非常によく似ています) 、または への参照を渡し、次のように新しいレコードを挿入できます。ADOQuery1.Requery ADOQuery2DataSet.CloseDataSet.OpenADOQuery1Tform2

ADOQuery1.Append;
// If you do not have some auto-inc primary key (or other) - generate it manually:
ADOQuery1.FieldByName('id').AsString := some_new_unique_id;
ADOQuery1.FieldByName('field1').AsString := sfield;
ADOQuery1.Post;

TDBGridにリンクされているに変更が反映されTDataSourceます。


ノート:

  • ADOQuery1.SQL.Clear経由でSQLを割り当てているため、呼び出す必要はありませんADOQuery1.SQL.Text := '...'
  • INSERT INTOデータにカーソルを返さないため、SQL ステートメントの後にADOQuery2.ExecSQL(not ) を付ける必要があります。ADOQuery2.Active := true
于 2013-10-03T09:03:33.870 に答える