我使用的是带有MySQL数据库的Delphi XE3。我有一个SQLconnection–SQLquery–DataSetProvider–ClientDataSet排列。当我对CDS进行修改时,数据库中的更改会受到正确影响,但当我刷新CDS时,"旧"值会被替换。我使用的代码是:
CDS.IndexFieldNames:='pop0';
CDS.first;
for W := 1 to 5 do begin // display the original data
memo2.lines.add (IntToStr(CDS['pop0'])); CDS.Next;
end;
memo2.lines.add('');
CDS.first;
CDS.Edit; // modify data
CDS['pop0']:= 3004;
CDS.Post;
CDS.first;
for W := 1 to 5 do begin // display the modified data
memo2.lines.add (IntToStr(CDS['pop0'])); CDS.Next;
end;
memo2.lines.add('');
CDS.ApplyUpdates(0) ;
messagedlg('Check database',mtInformation,[mbOK],0);
CDS.refresh;
CDS.first;
for W := 1 to 5 do begin // display the updated data
memo2.lines.add (IntToStr(CDS['pop0'])); CDS.Next;
end;
备忘录中的输出如下:
3
4
375
597
678
4
375
597
678
986
3
4
375
597
678
我试着关闭和打开CDS作为刷新的替代方案,但我得到了同样的结果。你知道为什么会这样吗?
你能告诉我们为什么调用Refresh吗?TClientDataSet(CDS)通常不需要这样做。
此外,当您打开CDS时,SQLQuery是打开的还是关闭的?它必须关闭,这样数据集提供程序(DSP)才能打开它,检索所有行并将其关闭。
如果DSP发现数据集已经打开,它将只沿着记录导航,构建记录包(命名为Data)并将其发送到CDS。数据集将被单独留下,而不是被关闭。