使用Delphi和SQL Server的ADO无法识别数据库更改
我运行了一个小型的数据库应用程序,它与我的SQL Server有2个使用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
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;