Delphi ADOQuery在另一个ADOQuery插入之后没有拿起记录

Ray*_*man 1 sql delphi ado

我不确定为什么会这样,所以我将简要解释一下情况(应该很容易理解):

Form1一个执行sql select语句并在通过TDataSource组件链接到ADOQuery1组件的dbgrid上显示它的过程:

procedure form1. Selectp;
begin
   ADOQuery1.Active:=false;
   ADOQuery1.SQL.Text:='select * from tbl';
   ADOQuery1.Active:=true;
end;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

Form2有一个过程,通过form2.ADOQuery2将值插入数据库.

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

如果我在form1上放置一个按钮来运行selectp,我必须在新记录显示之前按下它2次以上但是在buttonaddrecord中showmodal之后调用selectp多少次并不重要新记录没有出现.

造成这种情况的原因是什么以及如何纠正?

kob*_*bik 5

TDataSourceADOQuery1不可能知道的方式另一个 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;
Run Code Online (Sandbox Code Playgroud)

这些变化应反映在TDBGrid与之相关的变化中TDataSource.


笔记:

  • 无需调用,ADOQuery1.SQL.Clear因为您正在分配SQL viaADOQuery1.SQL.Text := '...'
  • INSERT INTO由于您没有将游标返回到数据,因此SQL语句后面应该是ADOQuery2.ExecSQL(not ADOQuery2.Active := true).