nyt72 Ответов: 1

Использование SQL-транзакции в VB.NET


Привет,

Я пытаюсь использовать SQL-транзакцию в первый раз. Пробовал он ниже кода, но он всегда ловит исключение транзакции.

Пожалуйста, кто-нибудь исправьте этот код для меня.

Я хочу откатить транзакцию и показать сообщение об ошибке, если какая-либо из всех записей потерпела неудачу.






Заранее спасибо.

Что я уже пробовал:

Я попробовал следующий код:

       dbConnection()
        Using transaction As SqlTransaction = conn.BeginTransaction
            Try

                cmd = New SqlCommand
                With cmd
                    For Each row As DataGridViewRow In dgw.Rows
                        If CheckExistingStu(row.Cells(2).Value) <> True Then
                            txt = Environment.NewLine &
            "insert into tblStudent(AdmissionNo,awrno,boardregno,AdmissionDate,
        StudentName,FatherName,DOB,Gender,FatherCNIC, FatherCNO, TemporaryAddress,Religion) 
        VALUES (@d3,@d4,@d5,@d6,@d10,@d11,@d12,@d13,@d14,@d15,@d16,@d17)" & Environment.NewLine & "

    INSERT INTO tblEnrollment ([StudentID],[SectionID],[CategoryID]
           ,[Is_Active])
     VALUES ((Select StudentID From tblStudent WHERE AdmissionNo=@d3),
        (Select tblSection.SectionID From tblSection
Where tblSection.SectionName=@d9 AND 
        tblSection.ClassID = (Select ClassID From tblClass Where tblClass.ClassName = @d8 
AND tblClass.SessionID = (Select SessionID From tblSession 
        WHERE tblSession.SessionName=@d7))),(Select CategoryID From tblStuCategory WHERE Category=@d18),1)
" & Environment.NewLine

                            Dim Jointarray As List(Of String) = New List(Of String)()
                            Jointarray.Clear()
                            test = row.Cells(18).Value.ToString
                            If Not String.IsNullOrWhiteSpace(test) Then
                                Jointarray.AddRange(test.Split(New Char() {","c}))
                                For Each str As String In Jointarray
                                    txt = txt + "
insert Into StudentDocSubmitted(DocID,AdmissionNo,DocName) VALUES ((SELECT [DocID]
  FROM [Document] WHERE [DocName] = '" & Trim(str) & "'),@d3,'" & Trim(str) & "')" & Environment.NewLine
                                Next
                            End If

                            sqL = sqL + txt

                            .Connection = conn
                            .CommandText = sqL
                            .Parameters.Clear()
                            .Parameters.AddWithValue("@d2", row.Cells(1).Value.ToString)
                            .Parameters.AddWithValue("@d3", row.Cells(2).Value.ToString)
                            .Parameters.AddWithValue("@d4", row.Cells(3).Value.ToString)
                            .Parameters.AddWithValue("@d5", row.Cells(4).Value.ToString)
                            .Parameters.AddWithValue("@d6", Convert.ToDateTime(row.Cells(5).Value).ToString("yyyy-MM-dd"))
                            .Parameters.AddWithValue("@d7", row.Cells(6).Value.ToString)
                            .Parameters.AddWithValue("@d8", row.Cells(7).Value.ToString)
                            .Parameters.AddWithValue("@d9", row.Cells(8).Value.ToString)
                            .Parameters.AddWithValue("@d10", row.Cells(9).Value.ToString)
                            .Parameters.AddWithValue("@d11", row.Cells(10).Value.ToString)
                            .Parameters.AddWithValue("@d12", Convert.ToDateTime(row.Cells(11).Value).ToString("yyyy-MM-dd"))
                            .Parameters.AddWithValue("@d13", row.Cells(12).Value.ToString)
                            .Parameters.AddWithValue("@d14", row.Cells(13).Value.ToString)
                            .Parameters.AddWithValue("@d15", row.Cells(14).Value.ToString)
                            .Parameters.AddWithValue("@d16", row.Cells(15).Value.ToString)
                            .Parameters.AddWithValue("@d17", Trim(row.Cells(16).Value.ToString))
                            .Parameters.AddWithValue("@d18", row.Cells(17).Value.ToString)

                        End If
                    Next
                    result = .ExecuteNonQuery
                    transaction.Commit()
                End With
            Catch ex As Exception
                Try
                    transaction.Rollback()
                Catch exRollback As Exception
                    ' Do logging or something when rollback failed.
                End Try
                MsgBox("Transaction failed check data / database settings")
            End Try
        End Using

W.G.C.

На первый взгляд, сам код кажется правильным; ошибка, скорее всего, в запросе.
Попробуйте добавить код к внешнему улову, чтобы показать, что такое фактическая ошибка.

1 Ответов

Рейтинг:
1

ZurdoDev

1. при обращении за помощью, пожалуйста, предоставьте сообщение об ошибке. Это заставит все идти намного быстрее. Кроме того, если бы вы просто погуглили сообщение об ошибке или даже прочитали его, то, скорее всего, смогли бы исправить его самостоятельно.
2. Вы никогда не соединяете свою транзакцию с вашей sqlcommand.

cmd.Transaction = transaction


[no name]

Спасибо, дорогая,это не дает мне никакого сообщения об ошибке, просто откатите транзакцию.

ZurdoDev

Единственный способ откатить транзакцию-это попасть в ваше исключение, которое может произойти только из-за ошибки.