如题
关键代码如下
procedure btnQueryClick(Sender: TObject); //查询数据
begin
ADOConnection1.Open;
ADODataSet1.Connection:=ADOConnection1;
ADODataSet1.Open;
ADODataSet1.Connection:=nil;
ADOConnection1.Close;
end;procedure btnUpdateClick(Sender: TObject); //更新数据
begin
ADOConnection1.Open;
ADODataSet1.Connection:=ADOConnection1;
ADODataSet1.UpdateBatch;
end;procedure btnSaveClick(Sender: TObject); //保存数据
begin
ADODataSet1.SaveToFile('D://test.xml',pfXML);
end;procedure btnLoadClick(Sender: TObject); //读取数据
begin
ADODataSet1.LoadFromFile('D://test.xml');
end;我的操作流程是这样的:
1.首先点击btnQuery查询数据(select * from ....)
2.点击btnSave保存数据(存到'D://test.xml')
3.点击btnLoad读取数据(从'D://test.xml')
4.修改DBGrid中的记录(即修改读取到ADODataSet1中的记录)
5.点击btnSave保存数据(同样存到'D://test.xml')
6.点击btnUpdate向数据库中提交更新后的数据,成功以上的过程都没有问题
现在我再次从硬盘中读取数据:7.点击btnLoad读取数据(从'D://test.xml')
8.修改DBGrid中的记录(即修改读取到ADODataSet1中的记录)
9.点击btnSave保存数据(同样存到'D://test.xml')
10.点击btnUpdate向数据库中提交更新后的数据~~~~~~~失败!!!
此时出现的提示消息是“不能为更新定位行,一些值可能在最后一次读取后已更改”我的问题是为什么会出现这样的错误,以及如何修改。
可能有人会问我为什么要这么做,其实我是希望ADODataSet在离开了数据源后仍然能访问已保存的数据,并修改它们,再连接上数据源,把更新结果提交到数据库。这样实现了所谓的ADO Briefcase模型功能(李维在《Delphi 5.x ADO/MTS/COM+》中提到的)小弟才疏学浅,无法解决以上描述的问题,请各位大哥大姐不吝赐教!!!
关键代码如下
procedure btnQueryClick(Sender: TObject); //查询数据
begin
ADOConnection1.Open;
ADODataSet1.Connection:=ADOConnection1;
ADODataSet1.Open;
ADODataSet1.Connection:=nil;
ADOConnection1.Close;
end;procedure btnUpdateClick(Sender: TObject); //更新数据
begin
ADOConnection1.Open;
ADODataSet1.Connection:=ADOConnection1;
ADODataSet1.UpdateBatch;
end;procedure btnSaveClick(Sender: TObject); //保存数据
begin
ADODataSet1.SaveToFile('D://test.xml',pfXML);
end;procedure btnLoadClick(Sender: TObject); //读取数据
begin
ADODataSet1.LoadFromFile('D://test.xml');
end;我的操作流程是这样的:
1.首先点击btnQuery查询数据(select * from ....)
2.点击btnSave保存数据(存到'D://test.xml')
3.点击btnLoad读取数据(从'D://test.xml')
4.修改DBGrid中的记录(即修改读取到ADODataSet1中的记录)
5.点击btnSave保存数据(同样存到'D://test.xml')
6.点击btnUpdate向数据库中提交更新后的数据,成功以上的过程都没有问题
现在我再次从硬盘中读取数据:7.点击btnLoad读取数据(从'D://test.xml')
8.修改DBGrid中的记录(即修改读取到ADODataSet1中的记录)
9.点击btnSave保存数据(同样存到'D://test.xml')
10.点击btnUpdate向数据库中提交更新后的数据~~~~~~~失败!!!
此时出现的提示消息是“不能为更新定位行,一些值可能在最后一次读取后已更改”我的问题是为什么会出现这样的错误,以及如何修改。
可能有人会问我为什么要这么做,其实我是希望ADODataSet在离开了数据源后仍然能访问已保存的数据,并修改它们,再连接上数据源,把更新结果提交到数据库。这样实现了所谓的ADO Briefcase模型功能(李维在《Delphi 5.x ADO/MTS/COM+》中提到的)小弟才疏学浅,无法解决以上描述的问题,请各位大哥大姐不吝赐教!!!
此时出现的提示消息是“不能为更新定位行,一些值可能在最后一次读取后已更改”;一般是没有主键.
但实际证明,就算有主键,有时也出现这样的问题.特别是作主/从表程序时.一个最保险但啰嗦的方法:
1.dataset的locktype设为batchcat...(不记得这几个单词了)
2.post
3.用一个adoCommand删除原来的记录
4.用insert into语句一个个把记录写入数据库
5.对dataset作cancelbatch操作
6.刷新数据