SQL - Ayuda T-SQL: Tratamiento de errores

 
Vista:
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL: Tratamiento de errores

Publicado por william (5 intervenciones) el 15/10/2020 21:36:05
Hola, quisiera saber como se muestran en C# (en un bloque try catch de C#) los errores ocurridos en un procedimiento almacenado en T-SQL.
Quisiera ejemplos

Gracias al foro

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ayuda T-SQL: Tratamiento de errores

Publicado por anonymous (43 intervenciones) el 15/10/2020 21:58:02
El bloque try catch en C# te controla errores propios ocurridos dentro de tu aplicación en C#, pero el error de un SP lo controlas allá en SQL Server y devuelves el número de error generado y la descripción, pero no necesariamente dentro del try catch en C#

Ejemplo en un OUT llamado P_RESULTADO en un sp de SQL Server, retornas el posible resultado de la operación

Luego en C#

int resultado = Convert.ToInt32(Cmd.Parameters["p_RESULTADO"].Value);

A la variable resultado definida como integer le asigno lo que devuelve SQL Server y dependiendo del valor muestro uno u otro mensaje, al usuario se le muestra un error digerible y entendible y el error técnico ese lo oculto para evitar sql injection y controlar internamente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL: Tratamiento de errores

Publicado por William (5 intervenciones) el 16/10/2020 22:31:22
Esta es la situación:

Tengo una clase llamada Datos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//Fichero Datos.cs
 
class Datos{
 
        private string CadenaConexion = "Data Source=Server; Initial Catalog=BD; Integrated Security=True";
        private SqlConnection conn;
        private DataTable dt;
 
        public Datos(){
            this.conn = new SqlConnection(this.CadenaConexion);
        }
 
        public int Modificar(int id, string categoria, string marca, string modelo, string clasificacion, string subclasificacion, string descripcion){
                                       int resultado = 0;
            dt = new DataTable();
            string query = "ModificarProducto";
            SqlCommand cmd = new SqlCommand(query, this.conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@ID", id));
            cmd.Parameters.Add(new SqlParameter("@CATEGORIA", categoria));
            cmd.Parameters.Add(new SqlParameter("@MARCA", marca));
            cmd.Parameters.Add(new SqlParameter("@MODELO", modelo));
            cmd.Parameters.Add(new SqlParameter("@CLASIFICACION", clasificacion));
            cmd.Parameters.Add(new SqlParameter("@SUBCLASIFICACION", subclasificacion));
            cmd.Parameters.Add(new SqlParameter("@DESCRIPCION", descripcion));
            cmd.Parameters.Add(new SqlParameter("@RESULT", resultado));
            SqlDataAdapter adap = new SqlDataAdapter(cmd);
            adap.Fill(dt);
            conn.Close();
            return resultado;
        }
}

En SQL Server tengo una tabla llamada productos que tiene la siguiente estructura:

1
2
3
4
5
6
7
8
9
create table productos(
    ID int primary key,
    CATEGORIA varchar(30) not null,
    MARCA varchar(30) not null,
    MODELO varchar(30) not null,
    CLASIFICACION varchar(30) not null,
    SUBCLASIFICACION varchar(30) not null,
    DESCRIPCION varchar(250) not null
);

Y el siguiente procedimiento almacenado:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
ALTER PROCEDURE ModificarProducto
	@ID int,
	@CATEGORIA varchar(30),
	@MARCA varchar(30),
	@MODELO varchar(30),
	@CLASIFICACION varchar(30),
	@SUBCLASIFICACION varchar(30),
	@DESCRIPCION varchar(250),
	@RESULT int output
AS
BEGIN
	SET NOCOUNT ON;
	BEGIN TRANSACTION
	BEGIN TRY
                        --esta linea es para probar si funciona el begin catch...end catch
			select 1/0;
 
			update productos
			set CATEGORIA = @CATEGORIA,
				MARCA = @MARCA,
				MODELO = @MODELO,
				CLASIFICACION = @CLASIFICACION,
				SUBCLASIFICACION = @SUBCLASIFICACION,
				DESCRIPCION = @DESCRIPCION
			where ID = @ID;
			COMMIT TRANSACTION
	END TRY
	BEGIN CATCH
	    set @RESULT=ERROR_NUMBER();
		IF (XACT_STATE()) = -1
			ROLLBACK TRANSACTION;
		IF (XACT_STATE()) = 1
			COMMIT TRANSACTION
		return;
	END CATCH
END

Luego tengo un formulario en donde llamo a la función Modificar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Fichero Form3.cs
 
private void btnGuardar_Click(object sender, EventArgs e){
            int resultado = 0;
            try
            {
                resultado = datos.Modificar(
                                                             System.Convert.ToInt32(txtId.Text),
                                                             txtCategoria.Text,
                                                             txtMarca.Text,
                                                             txtModelo.Text,
                                                             txtClasificacion.Text,
                                                             txtSubclasificacion.Text,
                                                             txtDescripcion.Text
                                    );
                if (resultado != 0)
                    throw new Exception("No se pudo modificar los datos");
            }catch (Exception exception1) {
                StringBuilder errorMessages = new StringBuilder();
                errorMessages.Append(
                                                       "Número de error: " + resultado.ToString() + "\n"+
                                                       "Mensaje: " + exception1.Message + "\n"
                                    );
                MessageBox.Show(errorMessages.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            Close();
}


NOTA: Lo cierto es que puse la línea select 1/0; en el procedimiento almacenado para ver si funcionaba todo bien pero resulta que nunca entra al bloque catch del método btnGuardar_Click. Creo que no me funciona el bloque BEGIN TRY...END TRY del sp en T-SQL.
Alguien me puede ayudar, soy novato.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Ayuda T-SQL: Tratamiento de errores

Publicado por anonymous (43 intervenciones) el 16/10/2020 23:01:02
No se que versión de SQL uses, pero en condiciones normales, si tu tienes un SP donde previamente declares un parametro asÍ:

1
2
3
4
5
6
7
8
9
10
11
@p_RESULTADO        INT OUT
 
BEGIN TRY
                      --- Instrucciones
                      --- Instrucciones
END TRY
 
BEGIN CATCH
      SET @P_RESULTADO = ERROR_NUMBER()
      RETURN @P_RESULTADO
END CATCH

Debería controlar el error que surja
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL: Tratamiento de errores

Publicado por William (5 intervenciones) el 17/10/2020 11:58:18
Entonces parece q el error mío radica en el

return @VariableOutput;

Probaré ahora, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 10
Ha aumentado su posición en 2 puestos en SQL (en relación al último mes)
Gráfica de SQL

Ayuda T-SQL: Tratamiento de errores

Publicado por william (5 intervenciones) el 18/10/2020 01:13:36
ya encontre este ejemplo que me ayudó a corregir el error.


https://blog.cloudboost.io/how-to-use-sql-output-parameters-in-stored-procedures-578e7c4ff188

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar