ExecuteNonQuery требует, чтобы у команды была транзакция, когда назначенное команде соединение находится в ожидающей локальной транзакции
У меня проблема с выполнением запросов через текст команды. Что я хочу сделать, это удалить данные из сетки данных и базы данных и повторно вставить их по выбору пользователя.
Ошибка:
ExecuteNonQuery требует, чтобы команда имела транзакцию, когда назначенное команде соединение находится в ожидающей локальной транзакции.
Вот код, где я удаляю:
Private Sub DeleteRecord(ByVal month As Integer)
Dim cmd As New SqlClient.SqlCommand
cmd.Connection = Connection
cmd.Transaction = transaction
cmd.CommandText = "DELETE FROM [dbo].[MEC_CAMPAIGN_DETAILS] WHERE MecMonth = '" & DTP_From.Value.Month & "'"
cmd.ExecuteNonQuery()
End Sub
и с помощью этой кнопки я генерирую данные:
Private Sub btn_Generate_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles btn_Generate.ItemClick
Dim cmd As New SqlClient.SqlCommand
cmd.Connection = Connection
Try
If Mcount > 0 Then
If MecMonth = DTP_From.Value.Month Then
If MsgBox("Do you want to delete and regenerate data for the same month?", MsgBoxStyle.Question & MsgBoxStyle.YesNo, "Confirmation") = MsgBoxResult.No Then Exit Sub
'cmd = New SqlCommand(" DELETE FROM [dbo].[MEC_CAMPAIGN_DETAILS] WHERE MecMonth = '" & DTP_From.Value.Month & "'", Connection)
DeleteRecord(DTP_From.Value.Month)
End If
Else
DeleteRecord(DTP_From.Value.Month)
'cmd = New SqlCommand("DELETE FROM [dbo].[MEC_CAMPAIGN_DETAILS] WHERE MecMonth = '" & DTP_From.Value.Month & "'", Connection)
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
INSERT_MEC_CAMPAIGN_DETAILS()
End Sub
и вот как я вставляю данные:
Dim sql As String
Dim cmd As New SqlClient.SqlCommand
Me.Grid_Data.DataSource = table
'Dim transaction As SqlClient.SqlTransaction
cmd.Connection = Connection
cmd.Transaction = transaction
Try
For i As Integer = 0 To Grid_Data.Rows.Count - 1
SERVICEITEMFID = Grid_Data.Rows(i).Cells(0).Value
C_FullName_Eng = Grid_Data.Rows(i).Cells(1).Value
C_FullName_Arb = Grid_Data.Rows(i).Cells(2).Value
C_PhoneNo = Grid_Data.Rows(i).Cells(3).Value
C_PhoneNo2 = Grid_Data.Rows(i).Cells(4).Value
Plate_Nbr = Grid_Data.Rows(i).Cells(5).Value
PlateCode_Desc = Grid_Data.Rows(i).Cells(6).Value
CodeID = Grid_Data.Rows(i).Cells(7).Value
SERVICEID = Grid_Data.Rows(i).Cells(8).Value
COLLECTIONDATE = Grid_Data.Rows(i).Cells(9).Value
MecMonth = DTP_From.Value.Month
sql = "INSERT INTO MEC_CAMPAIGN_DETAILS (SERVICEITEMFID ,C_FullName_Eng ,C_FullName_Arb,C_PhoneNo,C_PhoneNo2 ,Plate_Nbr ,PlateCode_Desc ,CodeID,COLLECTIONDATE ,SERVICEID,MecMonth)"
sql &= " values('" & SERVICEITEMFID & "','" & C_FullName_Eng & "','" & C_FullName_Arb & "','" & C_PhoneNo & "','" & C_PhoneNo2 & "','" & Plate_Nbr & "','" & PlateCode_Desc & "','" & CodeID & "','" & Format(COLLECTIONDATE, "MM/dd/yyyy") & "','" & SERVICEID & "','" & DTP_From.Value.Month & "')"
cmd = New SqlCommand(sql, Connection)
transaction = Connection.BeginTransaction(IsolationLevel.Serializable)
cmd.ExecuteNonQuery()
Next
transaction.Commit()
Catch ex As Exception
transaction.Rollback()
MsgBox(ex.Message)
End Try
transaction.Dispose()
1 ответ
У тебя есть FOR Loop
для вставки. Перед завершением цикла вы пытаетесь создать новую транзакцию, а предыдущая остается открытой без фиксации. Поэтому на следующей итерации вы получите ошибку. Убедитесь, что вы фиксируете, когда цикл заканчивается. Попробуйте переместить cmd.ExecuteNonQuery()
ниже Next
заявление