You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#应用连接SQL Server数据库登录验证异常求助

SQL Server与C#登录验证无错误提示且逻辑失效的解决方法

核心问题分析

  • 身份验证方式错误
    你的连接字符串使用Integrated Security=True,这是Windows集成身份验证,程序会直接以当前运行程序的Windows用户身份连接数据库,完全忽略你输入的用户名和密码,这就是无论输入什么都不会触发连接错误的根本原因。

  • 参数绑定错误
    绑定@UserName参数时,你传入的是txtUserName控件对象本身,而非用户输入的文本内容txtUserName.Text,导致SQL查询时使用的是控件的字符串标识(如System.Windows.Controls.TextBox),而非实际用户名,这会导致查询永远无法匹配到数据。

  • 查询语句与ExecuteScalar的误用
    ExecuteScalar()会返回查询结果的第一行第一列值,你用SELECT *的话,如果表的第一列不是数值类型,Convert.ToInt32会抛出异常,但由于连接本身无问题,这个异常被try-catch捕获后可能未被你注意到,核心问题还是前两点。

修复后的代码示例

public partial class LoginWindow : Window
{
    public LoginWindow()
    {
        InitializeComponent();
    }

    private void btnSubmit_Click(object sender, RoutedEventArgs e)
    {
        // 改用SQL Server身份验证,替换为你的实际SQL用户名和密码
        string connectionString = "Data Source=(local);Initial Catalog=yes;User ID=你的SQL账号;Password=你的SQL密码;";

        using (SqlConnection sqlCon = new SqlConnection(connectionString))
        {
            try
            {
                sqlCon.Open();

                // 用COUNT(*)直接获取匹配行数,避免类型转换问题且更高效
                string query = "SELECT COUNT(*) FROM yesno WHERE username = @UserName AND password = @Password";

                using (SqlCommand sqlCmd = new SqlCommand(query, sqlCon))
                {
                    // 正确绑定控件的文本属性
                    sqlCmd.Parameters.AddWithValue("@UserName", txtUserName.Text);
                    sqlCmd.Parameters.AddWithValue("@Password", txtPassword.Password);

                    int count = (int)sqlCmd.ExecuteScalar();

                    if (count == 1)
                    {
                        MessageBox.Show("登录成功");
                        // MainWindow dashboard = new MainWindow();
                        // this.Close();
                        // dashboard.Show();
                    }
                    else
                    {
                        MessageBox.Show("用户名或密码错误");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"连接或查询错误:{ex.Message}");
            }
            // using块会自动释放连接资源,无需手动关闭
        }
    }
}

额外注意事项

  • 密码存储安全:绝对不要明文存储密码,建议在数据库中存储密码的加盐哈希值(如SHA256),验证时对输入密码做相同哈希处理后再与数据库值比对。
  • SQL Server配置:确保你的SQL Server实例启用了SQL Server身份验证模式,且对应账号拥有yes数据库和yesno表的访问权限。
  • 资源释放:用using块包裹数据库连接和命令对象,可自动释放资源,避免连接泄漏。

内容的提问来源于stack exchange,提问作者SBGH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:52:40