2013-05-22 86 views
2

我一直使用存储过程。但我从来没有在存储过程中使用错误处理程序。我刚开始了解错误处理程序。我试图在我的存储过程中做到这一点,但我从未在我的应用程序中收到错误消息。我正在给我的存储过程如下SQL存储过程和错误处理

ALTER PROCEDURE [dbo].[E_AddDesignation] 

    @Designation nvarchar(100), 
    @Order int 

AS 
BEGIN 
SET NOCOUNT ON; 
    DECLARE @myRowCount int 

    SELECT DesignationID FROM Designation WHERE (DesignationName = @Designation) 
    SET @[email protected]@ROWCOUNT 
    IF(@myRowCount ! = 0) 
     BEGIN  
      RAISERROR('Already exists',5,1) 
     END 
    ELSE 
     BEGIN 
      insert into Designation(DesignationName,DesignationOrder) values (@Designation,@Order) 
      RAISERROR('Submitted Successfully',5,1) 
     END 
SET NOCOUNT OFF; 
END 

我想调用storedprocedures并获取像下面的错误消息。

Try    
      c.con.Open() 
      c.cm = New SqlCommand("E_AddDesignation", c.con) 
      c.cm.CommandType = CommandType.StoredProcedure 
      c.cm.Parameters.Add("@Designation", SqlDbType.NVarChar).Value = Designation 
      c.cm.Parameters.Add("@Order", SqlDbType.Int).Value = Order   
      c.cm.ExecuteNonQuery() 
      c.con.Close() 
     Catch ex As SqlException 
      Console.WriteLine(ex) 
     End Try 

我我做错了什么地方。请帮我找出错误。

回答

2

在你的代码是在养误差严重性10.

RAISERROR('Already exists',5,1) 

因此SQLConnection会将其视为InfoMessa ge并不例外。当SQL Server返回严重性为10或更低的消息时,会发生InfoMessage事件。严重程度在11到20之间的消息会引发错误,严重度超过20的消息会导致连接关闭。请检查here

你可能要检查数据库错误的严重性here

您可以连接多达InfoMessage事件,如下图所示:

// Assumes that connection represents a SqlConnection object. 
    connection.InfoMessage += new SqlInfoMessageEventHandler(OnInfoMessage); 

protected static void OnInfoMessage(object sender, SqlInfoMessageEventArgs args) 
{ 
    foreach (SqlError err in args.Errors) 
    { 
    Console.WriteLine("The {0} has received a severity {1}, state {2} error number {3}\n" + 
    "on line {4} of procedure {5} on server {6}:\n{7}", 
    err.Source, err.Class, err.State, err.Number, err.LineNumber, 
    err.Procedure, err.Server, err.Message); 
    } 
} 

欲了解更多信息,请查看this

为了处理例外您的存储过程本身,您可以使用SQL Server 2005之后的Try..Catch块。

编辑:您可能要检查this显示

HOW TO:在ADO.NET返回错误和警告从存储过程中的SQL Server

我希望它能帮助!

+0

它的工作。我使用严重性16.谢谢 –

1

我可能是错的,但我相信这将归结于您使用SET NOCOUNT ON;

尝试将SET NOCOUNT OFF;行移动到您的SET @[email protected]@ROWCOUNT行紧下方的行。然后存储过程应该能够返回一个值。

我似乎记得几年前有类似的问题。


另外,作为一个侧面说明,你可以替换下面的代码块:以较小的(在我看来更好)的代码是这样

SELECT DesignationID FROM Designation WHERE (DesignationName = @Designation) 
SET @[email protected]@ROWCOUNT 
IF(@myRowCount ! = 0) 

IF NOT EXISTS(SELECT * FROM Designation WHERE DesignationName = @Designation) 

我只是提到这一点,因为我曾经使用多年来使用的方法,直到找到EXISTS关键字!

2

您指定的5RAISERROR('Already exists',5,1))严重级别根据MSDN这意味着

Informational messages that return status information or report errors 
that are not severe. The Database Engine does not raise system errors with 
severities of 0 through 9. 

您应该返回16这是默认的严重级别

+0

它的工作。我使用严重性16.谢谢 –