【发布时间】:2011-07-10 16:45:55
【问题描述】:
是否可以在强类型数据集中进行批量更新?创建强类型数据集后,UpdateBatchSize 似乎不是一个选项。
【问题讨论】:
是否可以在强类型数据集中进行批量更新?创建强类型数据集后,UpdateBatchSize 似乎不是一个选项。
【问题讨论】:
您是否尝试将此属性添加到 DataAdapter?使用 Property UpdateBatchSize 扩展自动生成的 Adapter 类,例如(尚未测试):
Namespace DataSet1TableAdapters
Partial Public Class AddressTableAdapter
Public Property UpdateBatchSize() As Integer
Get
Return Me.Adapter.UpdateBatchSize
End Get
Set(ByVal value As Integer)
Me.Adapter.UpdateBatchSize = value
If value <> 1 Then
Me.Adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None
Me.Adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None
Me.Adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None
Else
Me.Adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
Me.Adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
Me.Adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
End If
End Set
End Property
End Class
End Namespace
查看自动生成的 designer.cs/vb 名称空间的名称以及您想要使用批量更新功能扩展的部分适配器类,并将它们放入与数据集同名但没有的文件中designer。如果你不能关注我,请看here。
C#
namespace DataSet1TableAdapters
{
public partial class AddressTableAdapter
{
public int UpdateBatchSize {
get { return this.Adapter.UpdateBatchSize; }
set {
this.Adapter.UpdateBatchSize = value;
if (value != 1) {
this.Adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;
this.Adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
this.Adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;
} else {
this.Adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
this.Adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
this.Adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord;
}
}
}
}
}
如果可行,它只能按照我描述的方式运行,因为您不能直接更改自动生成的文件,因为它会在更改时自动重新生成。
编辑:阅读this后,我更改了上面的代码以相应地设置UpdatedRowSource属性。
用以下代码测试:
Dim stopWatch As New Stopwatch
Dim da As New DataSet1TableAdapters.AddressTableAdapter
Dim tblAllAdresses As New DataSet1.AddressDataTable
Dim tsBS1, tsBS0 As TimeSpan
da.Fill(tblAllAdresses)
da.UpdateBatchSize = 1
For Each adrr As DataSet1.AddressRow In tblAllAdresses
adrr.ModifiedDate = Date.Now
Next
stopWatch.Start()
Dim addressesChanged As Int32 = da.Update(tblAllAdresses)
stopWatch.Stop()
tsBS1 = stopWatch.Elapsed
da.UpdateBatchSize = 0 '0 means maximum server can handle'
For Each adrr As DataSet1.AddressRow In tblAllAdresses
adrr.ModifiedDate = Date.Now
Next
stopWatch.Restart()
addressesChanged = da.Update(tblAllAdresses)
stopWatch.Stop()
tsBS0 = stopWatch.Elapsed
Console.WriteLine("tsBS1: " & tsBS1.Minutes & ":" & tsBS1.Seconds & ":" & tsBS1.Milliseconds) '12 seconds'
Console.WriteLine("tsBS0: " & tsBS0.Minutes & ":" & tsBS0.Seconds & ":" & tsBS0.Milliseconds) '9 seconds(on localhost!)'
【讨论】: