我有几种方法可以连接到SQL Server数据库。其中之一是通过存储过程检索数据表。在某些情况下,我使用这一个,其中存储过程对数据库进行实际更新,最后我只想返回多个值,因此检索数据表而不是输出参数。
我注意到如果在UPDATE语句期间发生错误,则不会自动回滚。
所以,我在我的CATCH语句中添加了ROLLBACK函数:
Public Function StoredProcReturnTable(ByVal colParameters As Collection, _
ByVal strProcName As String, ByVal strTableName As String, _
ByVal strServer As String, ByVal strDatabase As String) As Data.DataTable
Dim cn As SqlClient.SqlConnection
Dim cm As SqlClient.SqlCommand = New SqlClient.SqlCommand
Dim objParameter As SqlClient.SqlParameter
Dim ds As New DataSet
Dim da As SqlClient.SqlDataAdapter
Try
With cm
.CommandType = CommandType.StoredProcedure
.CommandTimeout = CommandTimeout
.CommandText = strProcName
For Each objParameter In colParameters
.Parameters.Add(objParameter)
Next
cn = GetCN(strServer, strDatabase)
.Connection = cn
cm.Transaction = cn.BeginTransaction
da = New SqlClient.SqlDataAdapter(cm)
da.Fill(ds)
cm.Transaction.Commit()
ds.Tables(0).TableName = strTableName
Return ds.Tables(0)
End With
Catch ex As Exception
cm.Transaction.Rollback()
Throw ex
Finally
Close(cn)
End Try
End Function
在测试带有异常的存储过程时,我注意到我的Debug Output窗口显示:
单步执行:逐步执行非用户代码&System; System.Data.SqlClient.SqlCommand.RunExecuteReaderTds' 步入:踩过非用户代码&System; System.Data.SqlClient.SqlCommand.ExecuteReader' 步入:踩过非用户代码&System;数据。 步入:踩过非用户代码&System;数据。 步入:踩过非用户代码&System;数据。 步入:踩过非用户代码' System.Data.Common.DbDataAdapter.Fill' 步入:踩过非用户代码' System.Data.Common.DbDataAdapter.Fill'
我确认回滚正在运行,但我担心因为那些消息我做错了什么?在我的常规INSERT / UPDATE / DELETE存储过程中使用ExecuteNonQuery()时,我不会收到这些消息。