2016-07-07 86 views
1

我在SQL Server中的存储过程2014和快递这样的:获取错误消息VB.NET程序

CREATE PROCEDURE dtUmum.prCoba 
AS 
BEGIN 
BEGIN TRY 
    SET NOCOUNT ON; 
    SELECT 1/0; 
    SET NOCOUNT OFF; 
END TRY 
BEGIN CATCH 
    DECLARE @varErrorMessage NVARCHAR(4000), @varErrorSeverity INT, @varErrorState INT; 
    SELECT @varErrorMessage = ERROR_MESSAGE(), @varErrorSeverity = ERROR_SEVERITY(), @varErrorState = ERROR_STATE(); 
    RAISERROR(@varErrorMessage,@varErrorSeverity,@varErrorState); 
END CATCH; 
END 

如果我执行存储过程在SQL Server Management Studio中是这样的:

EXECUTE dtUmum.prCoba; 

我得到这个错误的信息标签:

消息50000,级别16,状态1,过程prCoba,33号线
除以零遇到的错误。

我想这个消息显示在我的vb.net窗口窗体程序中。

在我的表单中,我添加了1个按钮和1个datagridview。

我的方法button_click这样的代码:

Try 
    Using cn As New SqlConnection("Server=.\SQLEXPRESS;Database=myDB;Integrated Security=True") 
     cn.Open() 
     Using cmd As New SqlCommand() 
      cmd.Connection = cn 
      cmd.CommandType = CommandType.StoredProcedure 
      cmd.CommandText = "dtUmum.prCoba" 
      Using da As New SqlDataAdapter(cmd) 
       Dim dt As New DataTable 
       da.Fill(dt) 
       da.FillSchema(dt, SchemaType.Source) 
       Me.DataGridView1.DataSource = dt 
      End Using 
     End Using 
     cn.Close() 
    End Using 
Catch SQLex As SqlException 
    Dim SSS As SqlError 
    MsgBox("Count = " & SQLex.Errors.Count) 
    For Each SSS In SQLex.Errors 
     MsgBox(SSS.Message) 
    Next 
End Try 

此代码不能在我的vb.net程序显示错误。

那么,我应该写什么代码来显示存储过程中的错误?

+0

而不是使用DataAdapter,你尝试用'dt.Load(cmd.ExecuteReader())'填充DataTable吗?参考:MarkN在[SqlDataAdapter和RAISERRORs]的倒数第二个帖子(https://social.msdn.microsoft.com/Forums/zh-CN/ad135c3f-2afb-40aa-9eff-28cff08514c3/sqldataadapter-and-raiserrors?forum=adodotnetdataproviders) 。 –

+0

第一个MessageBox(你应该在.Net而不是旧的VB6 MsgBox中使用它)显示计数吗?通常情况下,我不会为此或“For Each ... Next”循环而烦恼。我的错误处理程序通常只会执行'MessageBox.Show(SQLex.ToString)'。 'ToString'显示异常的完整细节,所以它不是很漂亮,而'Message'属性只显示消息描述。 – topshot

回答

0

我从Andrew Morton的评论中找到了答案。 我使用dt.Load(cmd.ExecuteReader()),它是工作。