【问题标题】:C#: Unhandled Exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dllC#:System.Data.dll 中发生“System.Data.SqlClient.SqlException”类型的未处理异常
【发布时间】:2016-05-10 15:05:09
【问题描述】:

我查看了有关此主题的类似问题,发现没有一个可以与我自己的问题进行足够接近的比较。有很多不同的方法可以触发相同的异常。

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

我仍在尝试完全理解它(我刚刚配备了它的复制代码以满足我的需要)。

谢谢。

【问题讨论】:

    标签: c# variables login guid scalar


    【解决方案1】:

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

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

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

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

    但请注意 - AddWithValue 基本上不应该使用,因为它可能会导致意外结果,而是使用 Add 并明确指定参数类型并设置参数值。详情见Can we stop using AddWithValue already文章。

    【讨论】:

    • 非常感谢,非常有帮助。我将对我的代码进行所有建议的更改,特别是使用 Add 而不是 AddWithValue。
    • 但是,当用 userGuid 替换用户名时,我仍然遇到同样的异常。我还没有用 .Add 尝试过,所以也许这就是问题所在?
    • @user3752329 哎呀......这是我的错字回答可能会误导你。您不应将用户名替换为 userguid。您的查询包含三个参数:@Username@Password@Userguid,因此应显式设置所有三个参数,而在原始代码中您只设置了用户名和密码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多