Subscribe

RSS Feed (xml)

Raising and Handling Stored Procedure Errors

To catch and handle an error raised from a stored procedure.


Use a try . . . catch block to catch serious errors. Use the SqlConnection.InfoMessage event handler to catch informational and warning messages.


The sample code, as shown below, uses a single stored procedure and two event handlers:



SP0210_Raiserror


Accepts two input parameters specifying the severity and the state of an error and raises an error with the specified severity and state.



Raise Error Button.Click


Creates a connection and attaches a handler for warning and information messages from the SQL Server. A Command is created for the SP0210_Raiserror stored procedure and the input parameters are defined. The user-specified severity and state are assigned to the input parameters and the stored procedure command is executed within a try statement.



SqlConnection.InfoMessage


Called when a warning or informational message is raised by the SQL Server.




Example: Stored procedure: SP0210_Raiserror


CREATE PROCEDURE SP0210_Raiserror
@Severity int,
@State int = 1
AS
if @Severity>=0 and @Severity <=18
RAISERROR ('Error of severity %d raised from SP 0210_Raiserror.', @Severity,
@State, @Severity)

if @Severity>=19 and @Severity<=25
RAISERROR ('Fatal error of severity %d raised from SP 0210_Raiserror.',
@Severity, @State, @Severity) WITH LOG

RETURN

The C# code is shown below.


Example: File: RaiserrorForm.cs



// Namespaces, variables, and constants
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

// . . .

private void raiseErrorButton_Click(object sender, System.EventArgs e)
{
resultTextBox.Text =
"Severity: " + severityTextBox.Text + Environment.NewLine +
"State: " + stateTextBox.Text + Environment.NewLine +
Environment.NewLine;

// Create the connection.
SqlConnection conn = new SqlConnection(
ConfigurationSettings.AppSettings["Sql_ConnectString"]);
// Attach handler for SqlInfoMessage events.
conn.InfoMessage += new SqlInfoMessageEventHandler(conn_InfoMessage);

// Define a stored procedure command and the parameters.
SqlCommand cmd = new SqlCommand("SP0210_Raiserror", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Severity", SqlDbType.Int);
cmd.Parameters.Add("@State", SqlDbType.Int);
// Set the value for the stored procedure parameters.
cmd.Parameters["@Severity"].Value = severityTextBox.Text;
cmd.Parameters["@State"].Value = stateTextBox.Text;

// Open the connection.
conn.Open( );
try
{
// Try to execute the stored procedure.
cmd.ExecuteNonQuery( );
}
catch(System.Data.SqlClient.SqlException ex)
{
// Catch SqlException errors.
resultTextBox.Text += "ERROR: " + ex.Message;
}
catch(Exception ex)
{
// Catch other errors.
resultTextBox.Text += "OTHER ERROR: " + ex.Message;
}
finally
{
// Close the connection.
conn.Close( );
}
}

private void conn_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
resultTextBox.Text += "MESSAGE: " + e.Message;
}

No comments:

Post a Comment