一个小的CS架构的应用程序,使用Access数据库,数据访问层想用 XSD Ado.net 减轻数据访问代码工作量但是测试之后发现可以正常读取数据,但不能插入、修改、删除数据,代码如下,Access 数据库中有一个 Address 表,表中有一个字段的名字也叫Address,其中第一行的值为:Old AddressEntity.DataSet1TableAdapters.AddressTableAdapter adapter = 
new Entity.DataSet1TableAdapters.AddressTableAdapter();
Entity.DataSet1 ds = new Entity.DataSet1();
adapter.Fill(ds.Address);MessageBox.Show(ds.Address[0].Address);
ds.Address[0].Address = "Address CCCC";
MessageBox.Show(ds.Address[0].Address);

ds.Address.AcceptChanges();
ds.AcceptChanges();
adapter.Update(ds.Address[0]);
ds.Address.AcceptChanges();
ds.AcceptChanges();

ds.Address.Clear();
adapter.Fill(ds.Address);
MessageBox.Show(ds.Address[0].Address);

ds.Address.Clear();
adapter.Fill(ds.Address);
MessageBox.Show(ds.Address[0].Address);
运行结果,分别弹出对话框:Old Address, Address CCC, OldAddress
数据库中的值也没有发生任何变化

解决方案 »

  1.   

    ds.AcceptChanges();这句话是导致数据库没有更新的原因,adapter.Update不是哪个记录都更新,它只会更新已经改过的记录,而AcceptChanges会抹掉更改标记,认为所有记录都没有改过,所以在AcceptChanges调用后adapter就会认为ds里的所有记录都没有改过,所以不会进行任何更新数据库的操作,把所有的AcceptChanges去掉,没必要手工调用这个方法,因为adapter.Update会在更新完数据库后自动调用AcceptChanges,
      

  2.   

    把所有的AcceptChanges去掉就对了,或者你调用DataRow.SetModified也可以手工把记录设置为修改过状态,比如ds.Address.AcceptChanges();
    ds.AcceptChanges();
    ds.Address[0].SetModified();
    adapter.Update(ds.Address[0]);这样也会更新数据库,不过这样多此一举了,不调用AcceptChanges就可以,
      

  3.   

    代码改成这样了,但是还是没有变化Entity.DataSet1TableAdapters.AddressTableAdapter adapter =   new Entity.DataSet1TableAdapters.AddressTableAdapter(); Entity.DataSet1 ds = new Entity.DataSet1(); adapter.Fill(ds.Address);  MessageBox.Show(ds.Address[0].Address); ds.Address[0].Address = "Address CCCC"; MessageBox.Show(ds.Address[0].Address);   adapter.Update(ds.Address[0]); 另外,插入数据也是不成功的,执行下面的语句之后,表里并没有增加任何行:
    adapter.Insert("AAAA", "BBB");