如题
关键代码如下
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.   

    顺便提一下,ADODataSet的LockType和CursorType都设置正确
      

  2.   

    就错误提示的本身来说,是因为你的上次修改保存后应该释放资源,要重新load数据到dataset。
      

  3.   

    保存test.xml文件前,你应该是这样这样做,先保存到数据库,再从数据取数据,然后保存到test.xml文件中,每次这样做,就不会出现你说的问题了.
      

  4.   

    to xjjrocker(了无痕):我不大明白你说的意思耶~~~~呵呵,能不能具体点说?to yi10000():你说的意思我懂,意思就是每次都存最新的数据,是吧?但是我想知道的是是否我的程序出的问题与XML本身的存储方式有关啊?或者也和ADO存储数据的方式有关?
      

  5.   

    10.点击btnUpdate向数据库中提交更新后的数据~~~~~~~失败!!!
    此时出现的提示消息是“不能为更新定位行,一些值可能在最后一次读取后已更改”;一般是没有主键.
    但实际证明,就算有主键,有时也出现这样的问题.特别是作主/从表程序时.一个最保险但啰嗦的方法:
    1.dataset的locktype设为batchcat...(不记得这几个单词了)
    2.post
    3.用一个adoCommand删除原来的记录
    4.用insert into语句一个个把记录写入数据库
    5.对dataset作cancelbatch操作
    6.刷新数据