2013-02-12 73 views
-1

我使用2 TADOConnection运行一个小型数据库应用程序到我的SQL Server。第一个连接仅用于使用ADOTable,DatasourceDBNavigator进行查看。 第二连接在运行时使用下面的代码ADO使用Delphi和SQL Server无法识别数据库更改

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不能识别我的第二个连接所做的更改?

+4

很简单,如果我按照您的意见没有新的记录将被插入了,也是先插入和第二步表到编辑模式并没有帮助 – whosrdaddy 2013-02-13 08:10:23

回答

3

试试这个,如果我重新正确的话,旧版Delphi/Adoverions中有一个问题,刷新不能按预期工作,而重新查询却没有问题。

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; 
+0

这个解决方案是由问题解决的,是XE3和ADO带来的这个bug吗? – user1769184 2013-02-19 08:21:45

+0

这不是一个ADO错误,我也有D7这个问题。 – bummi 2013-02-19 13:41:12

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在数据集的末尾添加一个新行(再次,这可能会根据使用的索引而改变)。

+0

* *更改**数据,而不是*添加新行*。如果你想添加一个新行,删除'Edit'并使用'Insert'。 – user1769184 2013-02-12 23:18:46

+1

你问到不使用2个adoconnections ... – 2013-02-12 23:22:43

+0

上面的代码是我的应用程序的第二种形式。我关闭表单,不管我在主窗体上的dbnavigator上按什么,更改/新插入的记录都不会显示。关闭应用程序并重新开始...显示记录。 – user1769184 2013-02-12 23:36:36