我不确定为什么会这样,所以我会简要解释一下情况(应该很容易理解):
Form1一个执行sql select语句并在通过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多少次并不重要新记录没有出现。
造成这种情况的原因是什么以及如何纠正?
答案 0 :(得分:5)
与TDataSource
关联的ADOQuery1
无法知道 其他 ADOQuery2
对数据库进行了更改。
您在 之后拨打ADOQuery1.Requery
,通过ADOQuery2
插入新行(非常类似于DataSet.Close
后跟DataSet.Open
),或者您可以将ADOQuery1
引用传递给Tform2
,并插入新记录,如下所示:
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
ADOQuery1.SQL.Text := '...'
INSERT INTO
SQL语句后跟ADOQuery2.ExecSQL
(不是ADOQuery2.Active := true
),因为您没有将光标返回数据。