Sql server 无法捕获跳过try..catch in代码的SQL Server SP错误
我有一个SQL Server存储过程。如果我在代码周围放置一个try块,它只捕获某些错误,而只是将一些错误推送到SSMS Messages窗口。我相信文档中说try..catch块不会捕获某些错误,例如,从不存在的表中进行选择 我的示例是通过同义词选择不存在的列,该同义词将其发送到“消息输出”窗格: Msg 207,16级,状态1,程序 dbo.TestSP,第185行[批处理起始行2] 无效的列名“InvalidColumn” 但是,我正在从代码而不是从SSM运行SP,并且没有返回任何错误或异常 具体地说,我的Command Execute方法只返回而不引发异常,返回值是空值,因此我完全不知道记录或向用户报告的错误是什么。我还尝试过完全删除try块,结果相同 我在VBA中使用的是老式的ADODB,但同样的原则也适用于.Net。我已经查看了命令对象属性,那里似乎没有太多,返回的状态是0 除了简单地说“未知错误”之外,还有什么方法可以在我的命令或连接对象中的某个地方捕获或查找这些错误,以便我可以记录它们 例如,我的存储过程如下所示,包含无效列的select语句会引发如上所示的错误,而不会引发错误Sql server 无法捕获跳过try..catch in代码的SQL Server SP错误,sql-server,vba,adodb,Sql Server,Vba,Adodb,我有一个SQL Server存储过程。如果我在代码周围放置一个try块,它只捕获某些错误,而只是将一些错误推送到SSMS Messages窗口。我相信文档中说try..catch块不会捕获某些错误,例如,从不存在的表中进行选择 我的示例是通过同义词选择不存在的列,该同义词将其发送到“消息输出”窗格: Msg 207,16级,状态1,程序 dbo.TestSP,第185行[批处理起始行2] 无效的列名“InvalidColumn” 但是,我正在从代码而不是从SSM运行SP,并且没有返回任何错误或异
ALTER PROCEDURE [dbo].[TestSP]
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
declare @returnCode int;
If object_id('syn_xxx','SN') is not null drop synonym syn_xxx
exec('create synonym syn_xxx for sometable')
SELECT TOP 1 InvalidColumn from syn_xxx
END TRY
BEGIN CATCH
set @returnCode=ERROR_NUMBER()
END CATCH
return @returnCode
END
我的代码是VBA,如下所示。Errors集合不包含任何内容,返回值为空字符串
Dim conn_ As ADODB.Connection
Dim cmd As New ADODB.Command
Set conn_ = New ADODB.Connection
conn_.Open dsn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "TestSP"
cmd.ActiveConnection = conn_
cmd.Execute
您在dsn中使用的是什么提供商
Private Sub CommandButton1_Click()
Dim con As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim errLoop As ADODB.Error
Dim i As Integer
Dim StrTmp As String
'On Error GoTo AdoError
On Error Resume Next
con.ConnectionString = "Provider=SQLNCLI11;" _
& "Server=(local);" _
& "Database=master;" _
& "Integrated Security=SSPI;"
con.Open
cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "TestSP"
cmd.Execute
MsgBox ("number of errors after procedure 'testproc' --- " & con.Errors.Count)
If con.Errors.Count > 0 Then
i = 1
' Process
StrTmp = StrTmp & vbCrLf & "VB Error # " & Str(Err.Number)
StrTmp = StrTmp & vbCrLf & " Generated by " & Err.Source
StrTmp = StrTmp & vbCrLf & " Description " & Err.Description
' Enumerate Errors collection and display properties of
' each Error object.
For Each errLoop In con.Errors
With errLoop
StrTmp = StrTmp & vbCrLf & "Error #" & i & ":"
StrTmp = StrTmp & vbCrLf & " ADO Error #" & .Number
StrTmp = StrTmp & vbCrLf & " Description " & .Description
StrTmp = StrTmp & vbCrLf & " Source " & .Source
i = i + 1
End With
Next
MsgBox (StrTmp)
End If
cmd.CommandText = "select 10 as test"
cmd.CommandType = adCmdText
cmd.Execute
MsgBox ("number of errors after 'select 10 as test' --- " & con.Errors.Count)
' Close all open objects.
If con.State = adStateOpen Then
con.Close
End If
End Sub
没有人可以调试看不见的代码。发布你的vba代码。不,同样的原则绝对不适用于.NET。如果在连接上引发错误,则会将其转换为SqlException,并提供完整的详细信息。如果您的CATCH没有重新显示不会发生的错误,但只要在SSMS中执行它,就会显示一个红色的错误,因此不会显示消息,并且所有其他内容都保持不变,那么将其作为SqlCommand运行也会如此。sql错误是一个提供程序错误,应该记录在连接的错误集合中:@SMor I已添加代码,但正如在原始帖子中详细介绍的那样,这有点不相关,只是存储过程在select上失败,但在按照Microsoft文档手动运行时被排除在TRY…CATCH之外,但我找不到任何方法来获取在代码中运行时ssms中显示的内容。errors集合也不包含错误。Try-catch将拾取运行时异常,而不是编译时异常。我知道您正试图在VBA中捕获它们,但更改SQL可能会有所帮助;初始目录=db;Provider=SQLOLEDB;综合安全=SSPI;除了在SP失败之前作为注释添加的任何RAISERROR行之外,我没有从SP返回任何内容。在将连接字符串更改为使用oledb后,上面答案中的代码返回:错误1:ADO错误-2147217900说明无效列名“InvalidColumn”。SQL Server的源Microsoft OLE DB提供程序谢谢,我会试试。