启动后如何停止执行dataAdapter.update

Posted

技术标签:

【中文标题】启动后如何停止执行dataAdapter.update【英文标题】:How to stop executing dataAdabter.update after starting 【发布时间】:2015-10-11 10:45:41 【问题描述】:

我正在尝试使用DataAdapter.Update 在数据库中进行批量更新,并且用户可以选择取消操作。

问题:当用户点击取消按钮时如何停止更新操作?

我的代码::

 Log("@@@@@ Saving BMPImages paths to the database @@@@@")
 objCommandBuilder = New SqlCommandBuilder(daImages)
 SavingImageObj.MyProgressBar.Maximum = tblImages.GetChanges.Rows.Count
 AddHandler tblImages.RowChanged, New DataRowChangeEventHandler(AddressOf tblImages_changed)
 daImages.Update(dsMAP, "BMPImages")

这是 RowChanged 处理程序::

Private Sub tblImages_changed(ByVal sender As Object, ByVal e As System.Data.DataRowChangeEventArgs)
    'Increment progress bar
    SavingImageObj.ThreadTask()

    If SkipFraming = True Then
        ' Here I should do something to stop the daImages.Update
        ' from continuing to execute
    End If
End Sub

我正在设置一个标志 [SkipFraming] 指示我应该在单击取消按钮时停止操作。

【问题讨论】:

How to cancel a long-running Database operation?的可能重复 我认为这个问题是后台工作人员的问题(线程问题)不像我的情况 【参考方案1】:

好的,我找到了解决问题的方法: 我应该为dataAdapter.RowUdpated 而不是dataTable.RowChanged 创建一个事件处理程序,以便能够停止更新[这只是一个状态更新=D(args.Status = UpdateStatus.SkipAllRemainingRows )]

以下是代码示例:

    ' Reset Updating progress counter
    UpdatingProgressCounter = 0

    'Open connection to update database
    objConn.Open()

    'Update database
    Log("@@@@@ Saving BMPImages paths to the database @@@@@")
    objCommandBuilder = New SqlCommandBuilder(daImages)
    SavingImageObj.MyProgressBar.Maximum = tblImages.GetChanges.Rows.Count
    AddHandler daImages.RowUpdated, New SqlRowUpdatedEventHandler(AddressOf daImages_updated)
    Log("========== Total Rows to be updated = [" & tblImages.GetChanges.Rows.Count & "] ==========")
    daImages.Update(dsMAP, "BMPImages")

    'Close database connection
    objConn.Close()


 Private Sub daImages_updated(ByVal sender As Object, ByVal args As System.Data.SqlClient.SqlRowUpdatedEventArgs)
    'Increment progress bar
    SavingImageObj.ThreadTask()

    ' Increment progress counter
    UpdatingProgressCounter += 1

    'Give control on UI
    If UpdatingProgressCounter Mod 10 = 0 Then
        Application.DoEvents()
        SkipFraming = True      'For Testing
    End If

    ' Skip updating remaining rows in case of cancelling the framing
    If SkipFraming = True Then
        Log("@@@@@@@@@@@@@@@@@ Skipping remaining rows @@@@@@@@@@@@@@@@@")
        args.Status = UpdateStatus.SkipAllRemainingRows
    End If
End Sub

希望对有类似情况的朋友有所帮助。

【讨论】:

以上是关于启动后如何停止执行dataAdapter.update的主要内容,如果未能解决你的问题,请参考以下文章

在我调用 r.exec 以启动 cmd 提示符后如何停止执行我的 java 程序

如何在Linux停止和启动postfix服务的命令

如何停止 Maven 执行

在 Python 中,如何执行 .exe 文件并在 n 秒后停止它? [复制]

C# winform中timer函数如何停止,点运行后可再次启动周期事件

SignalR 广播消息在停止/启动后重复