-1

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

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;

如果我使用此代码插入记录,则按下 Update Navigator 按钮时将看不到更改的数据。我需要重新启动我的应用程序才能看到我所有新插入的数据。为什么第一个 dbconnection 无法识别我的第二个连接所做的更改?

4

2 回答 2

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不带 the 的Edit(插入新行会自动使您进入更改数据的模式;您不需要单独Edit调用)。

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

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

于 2013-02-12T23:10:34.617 回答
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;
于 2013-02-13T00:22:53.417 回答