使用Delphi和SQL Server的ADO无法识别数据库更改

使用Delphi和SQL Server的ADO无法识别数据库更改,delphi,ado,Delphi,Ado,我运行了一个小型的数据库应用程序,它与我的SQL Server有2个TADOConnection。第一个连接仅用于使用ADOTable、Datasource和DBNavigator进行查看。 第二个连接是在运行时使用以下代码创建的 aConnection:=TADOConnection.create(nil); aTable:= TADOTable.create(nil); aConnection.LoginPrompt := false; ..... aTable.Edit; aTabl

我运行了一个小型的数据库应用程序,它与我的SQL Server有2个
TADOConnection
。第一个连接仅用于使用
ADOTable
Datasource
DBNavigator
进行查看。 第二个连接是在运行时使用以下代码创建的

aConnection:=TADOConnection.create(nil);

aTable:= TADOTable.create(nil);
aConnection.LoginPrompt := false;

.....
aTable.Edit;

aTable.Insert;

aTable.FieldByName(' ... ').AsInteger :=  .... ;

aTable.FieldByName(' .... ').AsString :=  ... ;

aTable.FieldByName(' .... ').AsString :=  ..... ;

aTable.Post;

aTable.active := false;

aConnection.connected :=false;

aTable.free;

aConnection.free;
如果我插入带有此代码的记录,如果我按“更新导航器”按钮,我将看不到更改的数据。我需要重新启动应用程序以查看所有新插入的数据。
为什么第一个数据库连接无法识别第二个连接所做的更改?

您有一个
编辑,然后紧接着一个
插入。这意味着您的编辑没有更改任何内容(因此没有要查看的更改),并且所有代码实际上都在更新新创建的行。换句话说,您告诉数据库您想使用
Edit
更改数据,立即告诉它“我想添加新行”(这意味着
Edit
不会更改任何数据),然后修改新添加行中的值。您还应该使用一个
t连接

 aTable.Edit;

 aTable.Insert;
只需删除
aTable.Insert你应该很好

// Change a row that already exists.
aTable.Edit;
aTable.FieldByName(' ... ').AsInteger :=  .... ;
aTable.FieldByName(' .... ').AsString :=  ... ;
aTable.FieldByName(' .... ').AsString :=  ..... ;
aTable.Post;
根据您对我的回答的评论,您似乎希望实际添加一行。在这种情况下,只需使用
Insert
而不使用
Edit
(插入新行会自动使您处于更改数据的模式;您不需要单独的
Edit
调用)


Edit
更改当前行,而
Insert
在当前位置添加新行(根据使用中的索引可能会更改)和
Append
在数据集末尾添加新行(同样,这可能会根据使用中的索引更改)。

尝试此操作,如果我没记错的话,在旧的Delphi/Adoverions中有一个问题,刷新没有按预期工作,而requery做得很好

procedure TForm2.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then
  BEGIN
    if Assigned(TDBNavigator(Sender).DataSource) then
      if Assigned(TDBNavigator(Sender).DataSource.DataSet) then
        if TDBNavigator(Sender).DataSource.DataSet is TCustomAdoDataset then
          TADODataSet(TDBNavigator(Sender).DataSource.DataSet).Requery;
  END;
end;

如果我按照您的建议不再插入新记录,那么第一步进行插入,第二步表格到编辑模式对您询问更改数据、不添加新行没有帮助。如果要添加新行,请删除
编辑
,只需使用
插入
。上面的代码是我的应用程序的第二种形式。我关闭表单,无论我在主表单上的dbnavigator上按什么,都不会显示更改/新插入的记录。关闭应用程序并重新启动。。。记录显示出来了。请仔细阅读我写的内容。对两个表使用一个
TADOConnection
,以便连接知道数据已更改。如果您需要在表单之间共享数据,您应该使用一个可在两个表单上使用的
TDataModule
,并且两个表单都使用一个连接。非常简单,不要使用2个ADO连接…这个解决方案通过问题解决了,这个错误是否随XE3和ADO一起消失了?这不是ADO错误,我在D7上也遇到了这个问题。
procedure TForm2.DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
begin
  if Button = nbRefresh then
  BEGIN
    if Assigned(TDBNavigator(Sender).DataSource) then
      if Assigned(TDBNavigator(Sender).DataSource.DataSet) then
        if TDBNavigator(Sender).DataSource.DataSet is TCustomAdoDataset then
          TADODataSet(TDBNavigator(Sender).DataSource.DataSet).Requery;
  END;
end;