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

时间:2013-02-12 23:06:37

标签: delphi ado

我运行一个带有TADOConnection的小型数据库应用程序到我的SQL Server。第一个连接仅供查看使用ADOTableDatasourceDBNavigator。 第二个连接是在运行时使用以下代码

创建的
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;

如果我使用此代码插入记录,如果按下“更新导航器”按钮,则无法看到更改的数据。我需要重新启动我的应用程序以查看所有新插入的数据。 为什么第一个dbconnection无法识别更改是我的第二个连接?

2 个答案:

答案 0 :(得分:3)

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

 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调用)。

aTable.Insert;
aTable.FieldByName(' ... ').AsInteger :=  .... ;
aTable.FieldByName(' .... ').AsString :=  ... ;
aTable.FieldByName(' .... ').AsString :=  ..... ;
aTable.Post;

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

答案 1 :(得分:3)

试试这个,如果我记得没错,旧的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;