none
Hola, Tengo un problema a la hora de enviar los datos a la base de datos (El procedimiento o la función 'Crearcuenta' esperaba el parámetro '@contra', que no se ha especificado ) RRS feed

  • Pregunta

  • este es el código que tengo en Visual Studio 2017

    public override Boolean Guardar()
            {
                if (Utilidades.ValidarFormulario(this, errorProvider1) == false)
                {
                    try
                    {
                        string cmd = string.Format("EXEC Crearcuenta '{0}','{1}','{2}''{3}''{4}''{5}'", txtidusu.Text.Trim(), txtNomusu.Text.Trim(), txtcuent.Text.Trim(), txtcontra.Text.Trim(), val.Text.Trim(), txtimag.Text.Trim());
                        Utilidades.Ejecutar(cmd);
                        MessageBox.Show("Se ha guardado correctamente!..");
                        return true;
    
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show("Ha ocurrido un error): " + error.Message);
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }

    Este es el código en SQL Server 2014 

    reate procedure Crearcuenta
    
    @Id_usu int, @Nom_usu varchar(50), @cuenta varchar(50), @contra varchar(50), @Status bit, @foto varchar(500)
    
    
    
    as
    
    --actualiza cuenta
    
    if NOT EXISTS (SELECT id_usuario FROM usuarios where id_usuario = @Id_usu)
    insert into usuarios(id_usuario,nom_usuario,cuenta,contra,Status_admin,Foto) values (@Id_usu,@Nom_usu,@cuenta,@contra,@Status,@foto)
    
    else
    
    update usuarios set id_usuario=@Id_usu, nom_usuario=@Nom_usu,cuenta=@cuenta, contra=@contra, Status_admin=@Status,Foto=@foto where id_usuario=@Id_usu

    sábado, 10 de noviembre de 2018 21:14

Respuestas

  • Algo no concuerda. Tal como lo tienes, no debería producirse el error que ves. Cuando estas cosas suceden, es el momento de "tirar" de las herramientas de depuración. Tienes dos herramientas para probar:

    Por una parte, en Visual Studio, pon un punto de ruptura en la línea que llama a "utilidades.ejecutar" y examina el valor que hay en la cadena cmd, a ver si es lo que se esperaba. Si es correcto, sigue paso a paso con F11, para que entre en la rutina, y continúa ejecutando por si detectas algo inesperado antes de que se llame a la base de datos.

    Por otra parte, en SQL Server, inicia una captura con el profiler y comprueba qué es exactamente lo que le llega, para verificar si es que difiere en algo de lo esperado. Comprueba también la definición del procedimiento almacenado leyendo exactamente la que está grabada (no el script que la graba). A veces te llevas sorpresas y resulta que por algún error el contenido del procedimiento no es el que crías que tenía.

    Finalmente, una advertencia: la forma en la que llamas al procedimiento es vulnerable a los ataques de inyección de SQL. Habitualmente se suelen alabar las virtudes del los procedimientos almacenados alegando que una de sus ventajas es que evitan los ataques de inyección. Pero eso solo es si lo llamas directamente parametrizándolo. Si lo llamas con un EXEC y concatenas los datos en la sentencia, entonces la vulnerabilidad existe exactamente igual que si hubieses concatenado los datos en una sentencia ad-hoc en lugar de usar un procedimiento almacenado. 

    sábado, 10 de noviembre de 2018 21:31