C#: в System.Data.dll произошло необработанное исключение типа «System.Data.SqlClient.SqlException»

Я просмотрел похожие вопросы по этому вопросу и не нашел ни одного, который мог бы сравниться достаточно близко с моей собственной проблемой. Есть много разных способов вызвать одно и то же исключение.

Я новичок в С# и работаю над простой формой входа, которая хранит информацию о пользователе в базе данных, а затем извлекает ее по запросу.

В режиме отладки строка, в которой генерируется исключение, выглядит так:

cmd.ExecuteNonQuery();

Предыдущие запуски не выдавали эту ошибку, это было только тогда, когда я добавлял guid или пытался хешировать свои пароли.

Дополнительная информация: «Необходимо объявить скалярную переменную @Userguid».

Я посмотрел это и снова получил разные ответы, например, некоторые думали, что это связано со строками подключения, и для их корреспондентов это вполне могло быть, но у меня раньше не было проблем со строкой, поэтому это казалось маловероятным. .

Это мое событие нажатия кнопки, исключение возникает внутри:

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(); 
        }
    }

Я все еще пытаюсь полностью понять это (его код копирования, который я только что снабдил своими потребностями).

Спасибо.


person Luke    schedule 10.03.2015    source источник


Ответы (1)


Ваш запрос содержит параметр @Userguid, но вы не добавили его в Parameters вашей команды SqlCommand.

Поскольку текст вашей команды является не вызовом хранимой процедуры, а «прямым» запросом, все параметры должны быть указаны явно.

Основываясь на логике вашего кода, похоже, вы должны добавить строку

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

Но обратите внимание - AddWithValue в принципе не следует использовать, потому что это может привести к неожиданным результатам, вместо этого используйте Add с явным указанием типа параметра и установленным значением параметра. См. раздел Можем ли мы отказаться от использования AddWithValue? уже статья для деталей.

person Andy Korneyev    schedule 10.03.2015
comment
Большое спасибо, невероятно полезно. Я внесу все предложенные изменения в свой код, в частности использование Add вместо AddWithValue. - person Luke; 10.03.2015
comment
Однако я все еще получаю то же исключение при замене имени пользователя на userGuid. Я еще не пробовал с .Add, так что, может быть, проблема в этом? - person Luke; 10.03.2015
comment
@user3752329 user3752329 ой ... это была моя опечатка в ответе, вероятно, вводит вас в заблуждение. Вы не должны заменять имя пользователя на userguid. Ваш запрос содержит три параметра: @Username, @Password и @Userguid, поэтому все три параметра должны быть заданы явно, тогда как в исходном коде вы задали только имя пользователя и пароль. - person Andy Korneyev; 10.03.2015