C#:未处理类型的异常' System.Data.SqlClient.SqlException'发生在System.Data.dll中

时间:2015-03-10 10:30:07

标签: c# variables login guid scalar

我已经查看了关于这个主题的类似问题,发现没有一个可以与我自己的问题进行足够密切的比较。有许多不同的方法可以触发相同的异常。

我是C#的新手,正在处理一个简单的登录表单,该表单在数据库中存储用户信息,然后根据请求检索它。

在调试模式下,抛出异常的行是:

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

我仍然在努力完全理解它(我的副本代码只是为了满足我的需要而配备)。

谢谢。

1 个答案:

答案 0 :(得分:6)

您的查询包含@Userguid参数,但您尚未将其添加到SqlCommand的Parameters中。

由于您的命令文本不是存储过程调用,而是“直接”查询 - 所有参数都应该显式提供。

根据您的代码逻辑,您似乎应该添加行

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

但请注意 - AddWithValue基本上不应该使用,因为它可能会导致意外结果,而是使用Add显式指定参数类型和设置参数值。有关详细信息,请参阅Can we stop using AddWithValue already文章。