Cómo: Devolver errores y advertencias de un SQL Server un procedimiento almacenado de ADO.NET

Seleccione idioma Seleccione idioma
Id. de artículo: 321903 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo describe cómo se muestran ambos de SQL Server errores y advertencias en ADO.NET. Si genera un error que tenga un nivel de gravedad de 10 o menos, que es una advertencia, se genera ninguna excepción. Esta advertencia no es para completar de la SqlErrorCollection. En su lugar debe enlazar el evento InfoMessage del objeto Connection y procesar el mensaje no existe.

Errores de SQL los procedimientos almacenados con un nivel de gravedad de 11 a 20 producen un error en SQL que se recoge en la SqlErrorCollection. Tenga en cuenta también que algunos errores que tienen un nivel de gravedad de 11 o anulación mayor todo el procedimiento almacenado.


Requisitos

La lista siguiente describe el hardware recomendado, software, infraestructura de red y los service Pack necesarios:
  • Microsoft Visual Studio .NET instalado en un compatible Sistema operativo Microsoft Windows
  • Un servidor SQL con la base de datos de ejemplo Northwind instalado
Este artículo se supone que está familiarizado con lo siguiente temas:
  • Visual Basic .NET
  • Acceso a datos ADO.NET

Crear el proyecto y agregue el procedimiento almacenado en SQL Server

En el siguiente ejemplo utiliza una combinación de gravedad 10 y 11 de gravedad muestra cómo utilizar ADO.NET para mostrar mensajes de error con los errores distintos niveles de gravedad. En este ejemplo también se muestra cómo utilizar IF...ELSE lógica en combinación con RAISERROR para proporcionar control de errores en los procedimientos almacenados de SQL.

En el ejemplo realiza una búsqueda simple en la tabla Customers de la Base de datos Northwind de SQL Server. Si uno de los CustomerIDs no se encuentra, un 10 SEV se produce la excepción. Si ambos de los CustomerIDs no se encuentran, a 11 SEV se produce la excepción y se anula el procedimiento almacenado. Tenga en cuenta que se ha denegado un controlador para enlazar el evento InfoMessage del objeto Connection para mostrar los errores que tienen un nivel de gravedad de 10 o menos.
  1. Siga estos pasos para crear nuevas ventanas de Visual Basic Proyecto de aplicación:
    1. Inicie Visual Studio. NET.
    2. En el menú archivo , seleccione nuevoy, a continuación, haga clic en proyecto.
    3. En el cuadro de diálogo Nuevo proyecto , haga clic en Proyectos de Visual Basic en Tipos de proyecto, haga clic en Aplicación de Windows en plantillasy, a continuación, haga clic en Aceptar.
  2. En el Explorador de servidores, configurar una nueva conexión de datos a la Base de datos Neptuno en un SQL Server disponibles.
  3. Expanda el nodo de base de datos Neptuno , haga clic en los procedimientos almacenadosy, a continuación, haga clic en el nuevo procedimiento almacenado.
  4. En la ventana de código del procedimiento almacenado, pegue el código de procedimiento almacenado siguiente:
    CREATE proc GetCustomers 
    @CustomerID1 nvarchar (5),
    @CustomerID2 nvarchar (5)
    AS
    DECLARE @err_message nvarchar(255)
    
    --if no customers found return SEV 11 error to abort stored procedure
    IF NOT EXISTS (Select CustomerID from Customers where CustomerID = @CustomerID1 or CustomerID =  @CustomerID2) 
    	BEGIN	
    	SET @err_message = @CustomerID1 + ' and ' + @CustomerID2 + ' Not found raise sev 11'
    	RAISERROR (@err_message, 11,1)
    	END
    
    --if 1st customerid not found throw SEV 10 exception
    IF EXISTS (Select CustomerID from Customers where CustomerID = @CustomerID1)
    	BEGIN
    	select * from Customers where CustomerID = @CustomerID1
    	END
    ELSE
    	BEGIN
    	SET @err_message = @CustomerID1 + ' not found raise sev 10'
                 RAISERROR (@err_message,10, 1) 	
    	END
    
    --if 2nd customerid not found throw SEV 10 exception
    IF EXISTS (select * from Customers where CustomerID = @CustomerID2)
    	BEGIN
    	select * from Customers where CustomerID = @CustomerID2
    	END
    ELSE
    	BEGIN
    	SET @err_message = @CustomerID2 +  ' not found raise sev 10'
        	RAISERROR (@err_message,10, 1) 
    	END
  5. Cierre la ventana de código de procedimiento almacenado y, a continuación, haga clic en para guardar los cambios.

Agregar código a las advertencias y errores de pantalla

  1. En la ventana de código de Form1, o de sus en Visual Basic .NET proyecto, agregar una referencia a System.Data.SQLClient agregando la línea siguiente a la parte superior del archivo Form1.vb:
    Imports System.Data.SqlClient
    					
  2. Arrastre los controles de cuadro de texto 2 (TextBox1 y TextBox2) desde el cuadro de herramientas para Form1.
  3. Presione F4 para cambiar la propiedad de texto de TextBox1 a ALFKI.
  4. Presione F4 para cambiar la propiedad Text de TextBox2 a ANATR.
  5. Arrastre un control de botón (Button1) desde el cuadro de herramientas a Form1 y, a continuación, presione F4 para cambiar la propiedad Text en Búsqueda.
  6. Haga doble clic en Button1y, a continuación, agregue el código siguiente al controlador de eventos Button1_Click :

    Nota Debe cambiar el ID de usuario <username> valor y la contraseña = valor de<strong password=""> a los valores correctos antes de ejecutar esto código. Asegúrese de que el identificador de usuario tiene los permisos adecuados para realizar esta operación operación en la base de datos.</strong> </username>
            Try
                Dim cn As New SqlConnection("Server=servername;Database=Northwind;User Id=<username>;Password=<strong password>")
                AddHandler cn.InfoMessage, AddressOf cn_InfoMessage
    
                cn.Open()
                Dim cmd As New SqlCommand("GetCustomers")
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cn
    
                cmd.Parameters.Add(New SqlParameter("@CustomerID1", SqlDbType.NVarChar, 5))
                cmd.Parameters.Add(New SqlParameter("@CustomerID2", SqlDbType.NVarChar, 5))
    
                cmd.Parameters("@CustomerID1").Value = TextBox1.Text
                cmd.Parameters("@CustomerID2").Value = TextBox2.Text
    
                Dim myReader As SqlDataReader = cmd.ExecuteReader()
                Dim RecordCount As Integer = 0
    
                'You must check the nextresult method because there is a possiblity that the
                'stored procedure may return multiple resultsets; the NextResult method
                'positions the DataReader at the next result in the resultset if you 
                'have multiple results, otherwise it will return false.
                Do
                Do while myreader.read()
                Debug.WriteLine("Found customer ID : " & myReader(0))
                Loop
                Loop While myreader.NextResult()
    
                myReader.Close()
    
            Catch SqlEx As SqlException
                Dim myError As SqlError
                            Debug.WriteLine("Errors Count:" & SqlEx.Errors.Count)
                For Each myError In SqlEx.Errors
                    Debug.WriteLine(myError.Number & " - " & myError.Message)
                Next
            End Try
    					
  7. Modifique la cadena de conexión para que apunte a la Northwind base de datos en el servidor SQL.
  8. Para mostrar los errores que tienen una gravedad de 10 o menos, Agregue la subrutina siguiente para controlar el evento InfoMessage :
        Public Sub cn_InfoMessage(ByVal sender As Object, ByVal e As System.Data.SqlClient.SqlInfoMessageEventArgs)
            Debug.WriteLine("info message event: " & e.Message)
        End Sub
    					
  9. Presione CTRL + F5 para ejecutar el programa. Haga clic en Button1 y tenga en cuenta en la ventana de salida que no se ve CustomerIDs ALFKI y ANATR. Para asegurarse de que la ventana de salida está visible, presione CTRL + ALT + O.

Generará y administrará una gravedad 10 advertencia

Cambie el valor en TextBox1 desde ALFKI a AAAAAy, a continuación, haga clic en Button1 para intentar seleccionar un valor que no existe en los clientes base de datos. El código de error personalizado en el procedimiento almacenado aplica reventado a esta situación y produce una excepción de gravedad 10. Verá que se produce una excepción de gravedad 10 y Mostrar con el evento InfoMessage del objeto Connection . Mensajes de error que tienen una gravedad de 10 o menos se tratan como mensajes informativos y no se devuelven como errores o en resultados de la consulta.

Generará y administrará una gravedad 11 excepción

En TextBox1 , cambie el valor de ALFKI a AAAAAy en TextBox2, cambie el valor de ANATR a AAAAAy, a continuación, haga clic en Button1. Esto no encuentra los dos valores en la base de datos a los clientes, y el procedimiento almacenado produce una excepción de gravedad 11. Ahora verá el error de gravedad 11 en SQLErrorCollection con el mensaje de error personalizado.

Referencias

Para obtener información adicional, haga clic en los números de artículo siguientes para verlos en Microsoft Knowledge Base:
308049 Cómo: Llamar a un procedimiento almacenado parametrizado utilizando ADO.NET y Visual Basic .NET
309490 Cómo: Controlar varios resultados mediante DataReader en Visual Basic .NET
316549 Cómo: Depurar almacenados procedimientos en Visual Studio .NET
321902 HOW TO: Llamada a procedimientos almacenados con valores opcionales en ADO.NET
308051 PRB: No se devuelven los parámetros de salida cuando ejecuta un comando de ADO.NET en Visual Basic .NET

Propiedades

Id. de artículo: 321903 - Última revisión: viernes, 30 de noviembre de 2012 - Versión: 8.0
La información de este artículo se refiere a:
  • Microsoft Visual Studio .NET 2002 Professional
  • Microsoft Visual Studio .NET 2003 Professional
  • Microsoft ADO.NET 1.1
Palabras clave: 
kbhowtomaster kbsqlclient kbsystemdata kbmt KB321903 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 321903

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com