我运行一个带有TADOConnection
的小型数据库应用程序到我的SQL Server。第一个连接仅供查看使用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;
如果我使用此代码插入记录,如果按下“更新导航器”按钮,则无法看到更改的数据。我需要重新启动我的应用程序以查看所有新插入的数据。 为什么第一个dbconnection无法识别更改是我的第二个连接?
答案 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;