批量更新强类型数据集?

3
在强类型数据集中是否可能进行批量更新?
一旦创建了强类型数据集,似乎UpdateBatchSize不再是一个选项。
1个回答

3

您是否尝试将此属性添加到DataAdapter中?例如,使用属性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 的文件中。如果您无法理解,请查看这里
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!)'

我的适配器上似乎没有UpdateBatchSize。这是有什么诀窍吗? - Carlos
@Carlos:是的,我已经使用属性UpdateBatchSize扩展了自动生成的TableAdapter。我已经在上面描述了它的工作原理。 - Tim Schmelter
@Tim:我不明白。你的代码难道不只是包装了一个名为UpdateBatchSize的成员吗? - Carlos
@Carlos:在你的数据集下,VS会生成一个designer.cs/vb文件。你不能直接更改它,因为它会在更改时重新生成。如果你查看这个文件,你会看到VS生成了哪些类。你需要创建一个同名但没有尾缀“designer”的文件。然后,你可以通过创建与该名称相同的部分类并将属性添加到该类中来扩展这些类(例如TableAdapters)的功能。使用与设计器文件相同的命名空间(例如DataSet1TableAdapters)。 MSDN: http://msdn.microsoft.com/en-us/library/ms171896%28VS.80%29.aspx - Tim Schmelter
@Tim:另一个问题...它实际上是什么时候发送更新批次的?有超时吗? - Carlos
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接