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

如何让此C#登录窗体实现大小写敏感?

让C#登录窗体验证逻辑实现大小写敏感的方案

嘿,要让你的登录验证实现大小写敏感,核心问题在于SQL Server默认的字符串比较是大小写不敏感的(比如默认排序规则SQL_Latin1_General_CP1_CI_AS里的CI就是Case Insensitive的意思)。下面给你几个实用的解决方案,顺便必须提醒你:你原来的代码直接拼接用户输入到SQL语句里,存在严重的SQL注入风险,一定要改成参数化查询!

方案1:在SQL查询中强制使用大小写敏感的排序规则

在WHERE子句的比较中,通过COLLATE关键字指定大小写敏感的排序规则(比如Latin1_General_CS_AS,CS代表Case Sensitive),这样就能让本次查询的用户名和密码比较区分大小写。同时改用参数化查询杜绝注入:

private void buttonLogin_Click(object sender, EventArgs e)
{
    // 数据库连接字符串
    string connStr = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\sesha\Documents\Visual Studio 2013\Projects\Achievers - Grocery Management System\Login Database\Login DB.mdf;Integrated Security=True;Connect Timeout=30";
    // 带COLLATE的参数化查询
    string query = @"SELECT * FROM [Table] 
                     WHERE username COLLATE Latin1_General_CS_AS = @Username 
                     AND password COLLATE Latin1_General_CS_AS = @Password";

    // 使用using自动释放连接资源
    using (SqlConnection sqlcon = new SqlConnection(connStr))
    {
        SqlCommand cmd = new SqlCommand(query, sqlcon);
        // 添加参数,避免SQL注入
        cmd.Parameters.AddWithValue("@Username", textBoxUsername.Text.Trim());
        cmd.Parameters.AddWithValue("@Password", textBoxPassword.Text.Trim());

        sqlcon.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        
        if (reader.HasRows)
        {
            MessageBox.Show("登录成功!");
            // 这里可以添加跳转到主窗体的逻辑
        }
        else
        {
            MessageBox.Show("用户名或密码错误!");
        }
        reader.Close();
    }
}

方案2:修改数据库列的默认排序规则(一劳永逸)

如果你希望所有针对用户名和密码的查询都默认区分大小写,可以直接修改表中username和password列的排序规则:

  • 打开SQL Server Management Studio(或LocalDB对应的管理工具),找到你的Login DB.mdf数据库和对应的表
  • 右键选择「设计」,选中username列
  • 在右侧属性窗口找到「排序规则」,选择一个以CS_AS结尾的规则(比如Latin1_General_CS_AS)
  • 对password列执行同样的操作,保存表结构

这样之后,所有针对这两列的查询都会默认区分大小写,不需要每次都在SQL里加COLLATE。

方案3:在C#层面做大小写敏感的比较(不推荐,但可用)

如果你暂时不想修改SQL查询或数据库结构,可以先通过不区分大小写的查询获取用户信息,再在C#里用严格的大小写比较:

private void buttonLogin_Click(object sender, EventArgs e)
{
    string connStr = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Users\sesha\Documents\Visual Studio 2013\Projects\Achievers - Grocery Management System\Login Database\Login DB.mdf;Integrated Security=True;Connect Timeout=30";
    // 先查询匹配的用户(不区分大小写)
    string query = @"SELECT username, password FROM [Table] WHERE username = @Username";

    using (SqlConnection sqlcon = new SqlConnection(connStr))
    {
        SqlCommand cmd = new SqlCommand(query, sqlcon);
        cmd.Parameters.AddWithValue("@Username", textBoxUsername.Text.Trim());

        sqlcon.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        
        if (reader.Read())
        {
            string dbUsername = reader["username"].ToString();
            string dbPassword = reader["password"].ToString();
            
            // 用StringComparison.Ordinal做大小写敏感的严格比较
            bool isUsernameMatch = string.Equals(textBoxUsername.Text.Trim(), dbUsername, StringComparison.Ordinal);
            bool isPasswordMatch = string.Equals(textBoxPassword.Text.Trim(), dbPassword, StringComparison.Ordinal);

            if (isUsernameMatch && isPasswordMatch)
            {
                MessageBox.Show("登录成功!");
            }
            else
            {
                MessageBox.Show("用户名或密码错误!");
            }
        }
        else
        {
            MessageBox.Show("用户名不存在!");
        }
        reader.Close();
    }
}

⚠️ 注意:这个方法的缺点是,如果数据库里存在多个只有大小写差异的用户名(比如Admin和admin),查询会返回第一个匹配的用户,可能导致逻辑混乱,所以更推荐前两个方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:08:42