ADO.NET数据访问探讨

                  

 

本文内容

 

1.  并发处理

2.  新增,修改后绑定问题

3.  总结

 

     使用ADONET访问数据库是我们日常程序设计用得最多的一项技术。在使用过程中,我们体现到了它为我们带来的便捷,使我们更好的完成数据访问操作。但在开发过程中,我们也会发现一些问题,这就需要我们花一定的时间解决。下面就把我在开发过程中遇到的问题拿出来,供大家探讨。

 

 

1.  并发处理

l        问题引入

 

这个问题会出现在多人用SqlDataAdapter更新同一个数据集的情况下。比如用户A,用户B同时用把数据转载到DataSet里,首先用户A修改了第一条数据,保存。然后用户B也修改第一条数据,当他保存时,就会出现并发冲突。

 

l        问题分析

 

使用SqlDataAdapter更新数据时,数据源必须拥有主键。但我们修改了DataSet里的数据后,通过SqlDataAdapter更新回数据库时,SqlDataAdapter并不单单利用主键作为条件来更新数据,事实上,SqlDataAdapter会把所有字段作为条件来更新。因为前面的用户已经修改了数据,所以后面用户更新时因为找不到满足全部条件的记录,所以就出现了无法更新的并发问题。

   

l        解决办法

         网络上流传的解决方法有几种,有设立互斥信号量的,有设置时间戳的,下面介绍一种微软的解决方案:

当发生并发问题时,我们可以让用户选择是放弃这次修改,重新加载数据,还是用这次修改的数据覆盖原来的数据。

如果点击“是”就简单的重新获取数据就可以了

如果点击“否”就要覆盖原来数据库里的数据了

点击否后的操作的原理如下

                                                                   i.              获取你修改过的数据的一个副本DataCopy

                                                                 ii.              从数据库获取最新的数据DataNew

                                                                iii.              DataNew填充DataSetNew

                                                               iv.              修改DataSetNew里与DataCopy对应要求修改的行与列

                                                                 v.              最次调用SqlDataAdapter来更新数据

 

 

2.  新增,修改后绑定问题

l        问题引入

这个问题出现在批量新增,修改后绑定到DataGrid的时候。这个时候一般保险的做法是重新到数据库读取数据进行填充。但这个作法在数据量很大的情况下,对性能的影响较大。假设我们是用dataset填充Datagrid的,那么我们可不可以使用本地的dataset再一次绑定到datagrid呢?

 

l        问题分析及解决办法

 

答案是可以,关键是用本地的dataset 绑定到DataGrid后,再进行批量的新增或修改后保存是否成功。

那就要根据实际情况来决定了。如果是批量修改,在使用本地的dataset来绑定到datagrid后,再次的修改或新增,都可以保存成功。如果是批量增加,那就要看增加时主键信息是由数据库自动生成,还是由我们来控制。如果是由我们来控制,那在我们的程序里,就应该用代码把这个主键同时更新到数据库和本地的Dataset。那后面的保存都没问题。如果主键是由数据库自动产生,那在第一次新增以后,必须重新从数据库读取信息,以保证第二次的批量新增,修改能成功执行。

 

3.  总结

       保存在本地的DataSet为我们开放人员提供了很多方便,这也是ADO.NET一个重要的特性。但因为它是本地的关系,也给我们带来不小麻烦。我们可以看出,其实上面的两个问题的本质是一样,就是本地的DataSet与数据库表内容是否同步。上面的解决办法的思想就是要同步数据,然后再进行下一次的数据操作。

       有没有什么技术可以做到不同步数据,但可以正常操作而不引起错误呢?其中的一个答案是智能客户端,如果大家有兴趣,可以了解一下这方面的内容,本文不作介绍。

 

 

 

 

 

你可能感兴趣的:(.net)