如何用DataSet.GetChanges来提升数据库资料更新效率。

(華版)

一般我们都是直接用回同一个DataSet来更新数据库里的资料,但有没有想过这样是很没有效率的做法!因为SqlDataAdapter要扫描整个DataSet里的数据的RowState;只有以下三个State的数据才传送回去数据库:
   DataRowState.Added
   DataRowState.Deleted
   DataRowState.Modified

  o_DataRowVersion.jpg

所以就要用DataSet.GetChanges方法来读取所指定(Added,Deleted或Modified)的数据,然后存到另一个新的DataSet(比如说:dsChanges)。这一来,当执行SqlDataAdapter.Update方法时就不再需要扫描那么多的数据了(比如说:Unchanged的DataRow)。

None.gif      ' 声明变量
None.gif
     Private  ds  As  DataSet
None.gif    
Private  dsChanges  As  DataSet
None.gif
None.gif
None.gif    
' (前)
None.gif
     ' 刷新数据库里的资料
None.gif
    da.Update(ds)
None.gif
None.gif
None.gif    
' (后)
None.gif
     ' 实列化DataSet Class
None.gif
    dsChanges  =   New  DataSet
None.gif    
' 读取所有更改,新添加,删除的数据
None.gif
    dsChanges  =  ds.GetChanges(DataRowState.Added  Or  DataRowState.Deleted  Or  DataRowState.Modified)
None.gif    
' 刷新数据库里的资料
None.gif
    da.Update(dsChanges)


而且每一个DataRow都会保存两份数据;一份是原本的数据(在还没有更改时)和更改后的数据(RowState = DataRowState.Modified)。这也是SqlDataAdapter用来面对数据conflict时的重点数据。因为DataSet是保存在用户端的数据(就是ADO.NET的设计重点"Disconnected Environment");所以存在数据库里的数据随时都可以被另一个程序更改而没有反映在别的用户端里的DataSet。

如果没有了Original的数据,那SqlDataAdapter里的UpdateCommand的CommandText就如以下:

  UPDATE Customers SET ContactName = @ContactName WHERE CustomerID = @CustomerID

但是如果有了Original的数据后;整个CommandText就会复杂多了(尤其是那些读取整个table的数据那种!)和更加保险:

   UPDATE Customers SET ContactName = @ContactName WHERE CustomerID = @CustomerID AND ContactName = @OrigContactName

而@ContactName就是读取自DataRow.Item("ContactName", DataRowVersion.Current)和@OrigContactName就读取自DataRow.Item("ContactName", DataRowVersion.Original)。当然SqlDataAdapter.UpdateCommand里的CommandText就会复杂多一些了。。。


None.gif              ' 实列化SqlDataAdapter控件里的UpdateCommand Class
None.gif
            prm( 2 =   New  SqlParameter
None.gif            
With  prm( 2 )
None.gif                .ParameterName 
=   " @ContactName"
None.gif
                .Direction  =  ParameterDirection. Input
None.gif                .SqlDbType 
=  SqlDbType.NVarChar
None.gif                .Size 
=   40
None.gif                .SourceColumn 
=   " ContactName"
None.gif
                .SourceVersion  =  DataRowVersion.Current
None.gif            
End   With
None.gif
None.gif            prm(
3 =   New  SqlParameter
None.gif            
With  prm( 3 )
None.gif                .ParameterName 
=   " @OrigContactName"
None.gif
                .Direction  =  ParameterDirection. Input
None.gif                .SqlDbType 
=  SqlDbType.NVarChar
None.gif                .Size 
=   40
None.gif                .SourceColumn 
=   " ContactName"
None.gif
                .SourceVersion  =  DataRowVersion.Original
None.gif            
End   With
None.gif
None.gif            prm(
4 =   New  SqlParameter
None.gif            
With  prm( 4 )
None.gif                .ParameterName 
=   " @CustomerID"
None.gif
                .Direction  =  ParameterDirection. Input
None.gif                .SqlDbType 
=  SqlDbType.NChar
None.gif                .Size 
=   5
None.gif                .SourceColumn 
=   " CustomerID"
None.gif
                .SourceVersion  =  DataRowVersion.Original
None.gif            
End   With
None.gif
None.gif            
' 实列化SqlCommand Class
None.gif
            cmd( 1 =   New  SqlCommand
None.gif            
' 设定SqlCommand对象的属性
None.gif
             With  cmd( 1 )
None.gif                .Connection 
=  cn
None.gif                .CommandTimeout 
=   10
None.gif                .CommandText 
=   " UPDATE Customers SET ContactName = @ContactName WHERE CustomerID = @CustomerID AND ContactName = @OrigContactName"
None.gif
                .CommandType  =  CommandType.Text
None.gif                .Parameters.Add(prm(
2 ))
None.gif                .Parameters.Add(prm(
3 ))
None.gif                .Parameters.Add(prm(
4 ))
None.gif            
End   With
None.gif
None.gif            
' 实列化SqlDataAdapter Class
None.gif
            da  =   New  SqlDataAdapter
None.gif            da.UpdateCommand 
=  cmd( 1 )

點撃下載代碼

转载于:https://www.cnblogs.com/hackzai/archive/2005/04/12/136150.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值