He mirado a través de las preguntas similares sobre este tema y no encontré ninguno que se pueda comparar con suficiente atención a mi propio problema. Hay un montón de maneras diferentes para desencadenar la misma excepción.

Soy nuevo en C# y estoy trabajando en un simple formulario de inicio de sesión que almacena la información de usuario en una base de datos y, a continuación, recupera a su petición.

En modo de depuración, la línea en la que se produce la excepción es:

cmd.ExecuteNonQuery();

Carreras anteriores no tirar este error, sólo cuando he añadido en un guid o empezaron a tratar de hash de contraseñas.

Más información: ‘Debe declarar la variable escalar «@Userguid».’

Miré de esto y una vez más obtuvo respuestas diferentes, por ejemplo, algunos pensaron que iba a hacer con las cadenas de conexión y de sus corresponsales que bien podría haber sido – pero para mí no había tenido ningún problema con la cadena antes de lo que parecía poco probable.

Este es mi evento de clic de botón, se produce la excepción dentro de:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        CheckUserInput();
        CheckPassInput(); 

        //Can we create the account?
        if (canProceedUserPass == true && canProceedPass == true)
        {
            //Add username and password to my SqlDb table 'Users'. 
            Username = NewUsername.Text;
            Password = NewPassword.Password.ToString();
            Guid userGuid = System.Guid.NewGuid();

            string hashedPassword = Security.HashSHA1(Password + userGuid.ToString());

            SqlConnection con = new SqlConnection(connectionstring);
            using (SqlCommand cmd = new SqlCommand("INSERT INTO [Users] VALUES (@Username, @Password, @Userguid)", con))
            {
                cmd.Parameters.AddWithValue("@username", Username);
                                                       //HashSHA1 takes a hashed string as a parameter. 
                                                       //Password is effectively replaced by the hash. 
                cmd.Parameters.AddWithValue("@password", Security.HashSHA1(Password));


                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
            MessageBox.Show("Thank you " + Username);

            var myWindow = new MainWindow();
            myWindow.Show();
            this.Close(); 
        }
    }

Todavía estoy tratando de entender esto (su copia el código que he equipado para satisfacer mis necesidades).

Gracias.

InformationsquelleAutor Luke | 2015-03-10

1 Comentario

  1. 6

    Su consulta contiene @Userguid parámetro, pero todavía no agregó en Parameters de su SqlCommand.

    Desde su comando de texto no es una llamada a un procedimiento almacenado, pero un «directo» de la consulta – todos los parámetros deben ser proporcionados de forma explícita.

    Basado en el código de la lógica parece que se debe añadir la línea

    cmd.Parameters.AddWithValue("@Userguid", userGuid);

    Pero tenga en cuenta – AddWithValue no debe utilizarse, en principio, ya que puede llevar a resultados inesperados, en lugar de utilizar Add con especificación explícita de tipo de parámetro y valor de parámetro de conjunto. Ver Podemos dejar de usar AddWithValue ya artículo para obtener más detalles.

    • Muchas gracias, muy útil. Voy a hacer todos los cambios sugeridos a mi código, en particular el uso de Agregar en lugar de AddWithValue.
    • Sin embargo, me sigue apareciendo el mismo excepción cuando se sustituya el nombre de Usuario con userGuid. Yo no lo he probado con .Agregar todavía, así que tal vez ese es el problema?
    • oops… fue mi error tipográfico en respuesta probablemente inducir a error. Usted no debe reemplazar el nombre de usuario con userguid. La consulta contiene tres parámetros: @Username, @Password y @Userguid, todos los tres parámetros se debe establecer de forma explícita, mientras que en su código original que he puesto solo nombre de usuario y contraseña.

Dejar respuesta

Please enter your comment!
Please enter your name here