none
guardar select de store procedure en variable c# RRS feed

  • Pregunta

  • Buen dia compañeros

    Tengo un problema al ejecutar un ExecuteScalar ya que siempre trabajaba con un solo parametro de salida para guardarlo en alguna variable en mi codigo c#, ahora necesito 2 variables.

    Tengo un sistema web de tickets de help desk, el usuario crea el ticket y uno de los campo es "correo", en mi store primero hace un select al correo y si lo encuentra lo guarda dentro de una variable en mi store, si no retorna un -1 , luego hago un siwtch en mi codigo c# para mandar un error o mostrar un mensaje de registro con exito.

    Ahora al hacer el inser este crea un id autonumerico que quiero recuperar para poder crear una carpeta y asignarle el nombre de este # de id (esto con el fin de poder subir archivos a una carpeta como evidencia)

    El detalle es que para recuperar el correo utilizo un ExecuteScalar y si pongo tambien el ExecuteScalar en el id se hace el insert 2 veces. ¿Como puedo obtener los dos valores ejecutando 1 ves el store?

    using (SqlCommand cmd = new SqlCommand("sp_casportal"))
                    {
                        using (SqlDataAdapter sda = new SqlDataAdapter())
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@correo", txtcorreo.Text.Trim());
                            cmd.Parameters.AddWithValue("@titulo", txttituloproblema.Text.Trim());
                            cmd.Parameters.AddWithValue("@problema", txtproblema.Text.Trim());
                            cmd.Parameters.AddWithValue("@categoriacas", ddlcategoria.SelectedValue);
                            cmd.Connection = con;
                            con.Open();
                            correo = Convert.ToInt32(cmd.ExecuteNonQuery());
                            idcas = (int)(cmd.ExecuteNonQuery());
                            txtidcas = idcas.ToString();
                            con.Close();
                        }
                        switch (correo)
                        {
                            case -1:
                                Response.Write("<script type='text/javascript'>");
                                Response.Write("alert('Error: Correo no existe');");
                                Response.Write("document.location.href='agregarimpresora.aspx';");
                                Response.Write("</script>");
                                break;
    
                            default:
                                //obtenemos el nombre del directorio
                                string directorio = $"C:\\CAS\\{txtidcas}";
                                //Creamos la carpeta con con el nombre # de CAS
                                Directory.CreateDirectory(directorio);
    
    
                                
                                Response.Write("<script type='text/javascript'>");
                                    Response.Write("alert('Ticket generado con Exito, se envio un correo con la informacion');");
                                    Response.Write("document.location.href='cas_portal.aspx';");
                                    Response.Write("</script>");
                                break;
                        }

    CREATE PROCEDURE [dbo].[sp_casportal]
    @correo VARCHAR(30),
    @titulo VARCHAR(30),
    @problema VARCHAR(100),
    @categoriacas INT
    AS
    BEGIN
    	DECLARE @idempleado INT
    	DECLARE @idcas INT
    	SELECT @idempleado = idempleado FROM tbl_empleado WHERE correo = @correo
    
    	if @idempleado IS NOT NULL 
    		BEGIN
    			INSERT INTO tbl_cas(correo,titulo,problema,fecha,idempleado,idestatus,idcategoria)
    			VALUES (@correo,@titulo,@problema, GetDate(), @idempleado, 1, @categoriacas)
    
    			SELECT @idcas = MAX(idcas) FROM tbl_cas
    			SELECT @idcas [idcas] -- pasa el valor del ultima idcas hacia c#
    		END
    		ELSE
    		BEGIN
    			SELECT - 1 --Correo no encontrado
    		END
    	END
    GO

    Soy nuevo en SQL y solo he utilizado el Select @variable [variable en c#] para retornar el valor

    jueves, 13 de junio de 2019 14:11

Respuestas

Todas las respuestas

  • hola

    >>¿Como puedo obtener los dos valores ejecutando 1 ves el store?

    si quieres conserver el ExecuteScalar() podrias definir un parametro de salida

     Using "OUT" Parameter with Stored Procedure In ASP.NET

    valida como us

    cmd.Parameters.Add("@ERROR", SqlDbType.Char, 500);  
    cmd.Parameters["@ERROR"].Direction = ParameterDirection.Output;  


    para despues tomar el valor usando

    message = (string) cmd.Parameters["@ERROR"].Value;

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 13 de junio de 2019 15:41
  • Hola Eduardo Velazquez

    Gracias por levantar tu consulta en los foros de MSDN de Microsoft, con respecto a la misma, te compartiré a continuación los siguientes enlaces en los cuales consisten en documentación oficial sobre procedimientos almacenados, y casos similares al que nos estás reportando. 

    https://social.msdn.microsoft.com/Forums/es-ES/5c7bd636-2443-472d-a90e-bd5d916db2cc/proyecto-c-y-procedimientos-almacenados?forum=vcses

    https://docs.microsoft.com/es-es/sql/relational-databases/stored-procedures/return-data-from-a-stored-procedure?view=sql-server-2017

    https://social.msdn.microsoft.com/Forums/en-US/0948a70c-eb5a-45c6-87f3-689519c96586/recuperar-valor-devuelto-por-procedimiento-almacenado-en-c?forum=netfxes

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. 

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

     

     

    jueves, 13 de junio de 2019 15:43
    Moderador
  • hola

    >>¿Como puedo obtener los dos valores ejecutando 1 ves el store?

    si quieres conserver el ExecuteScalar() podrias definir un parametro de salida

     Using "OUT" Parameter with Stored Procedure In ASP.NET

    valida como us

    cmd.Parameters.Add("@ERROR", SqlDbType.Char, 500);  
    cmd.Parameters["@ERROR"].Direction = ParameterDirection.Output;  


    para despues tomar el valor usando

    message = (string) cmd.Parameters["@ERROR"].Value;

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    Excelente!!! Ya pude resolverlo, cambie a EcecuteScalar y agrege el parametro, tambien en mi store agrege un OUTPUT , y retorne el id con SCOPE_IDENTITY y listo

    CREATE PROCEDURE [dbo].[sp_casportal]
    @correo VARCHAR(30),
    @titulo VARCHAR(30),
    @problema VARCHAR(100),
    @categoriacas INT,
    @idcas INT OUTPUT
    AS
    BEGIN
    	DECLARE @idempleado INT
    	SELECT @idempleado = idempleado FROM tbl_empleado WHERE correo = @correo
    
    	if @idempleado IS NOT NULL 
    		BEGIN
    			INSERT INTO tbl_cas(correo,titulo,problema,fecha,idempleado,idestatus,idcategoria)
    			VALUES (@correo,@titulo,@problema, GetDate(), @idempleado, 1, @categoriacas)
    
    			SELECT @idcas = SCOPE_IDENTITY()
    
    		END
    		ELSE
    		BEGIN
    			SELECT - 1 --Correo no encontrado
    		END
    		Return @idcas
    	END
    GO

    using (SqlDataAdapter sda = new SqlDataAdapter())
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@correo", txtcorreo.Text.Trim());
                            cmd.Parameters.AddWithValue("@titulo", txttituloproblema.Text.Trim());
                            cmd.Parameters.AddWithValue("@problema", txtproblema.Text.Trim());
                            cmd.Parameters.AddWithValue("@categoriacas", ddlcategoria.SelectedValue);
                            cmd.Parameters.Add("@idcas", SqlDbType.Char, 500);
                            cmd.Parameters["@idcas"].Direction = ParameterDirection.Output;
                            cmd.Connection = con;
                            con.Open();
                            correo = Convert.ToInt32(cmd.ExecuteScalar());
                            txtidcas = (string)cmd.Parameters["@idcas"].Value; 
                            con.Close();
                        }

    Aunque no estoy seguro si ese ultimo Return sale sobrando

    Gracias!

    jueves, 13 de junio de 2019 16:07