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

ATM项目SQL验证异常:输入正确PIN却提示‘Pin not found!’

问题排查与修复方案

核心问题分析

  • SQL语句拼接引发的类型异常:如果数据库中Pin字段是数字类型(如int/bigint),你当前的SQL语句WHERE Pin = '"+pin+"'是把数字类型的Pin当成字符串查询,会触发SQL类型转换异常,被catch块捕获后就会输出“Pin not found!”,本质不是PIN不存在,而是SQL执行出错。
  • 业务逻辑漏洞:验证PIN时只单独查询Pin字段,没有关联之前输入的卡号,既不符合ATM“卡号+PIN”的验证逻辑,还会出现多个用户PIN相同时匹配错误用户的问题。
  • 宽泛的异常捕获:无差别捕获所有异常,掩盖了真正的错误原因(比如SQL语法错误、数据库连接问题),让你误以为是PIN不存在。

修复后的代码

static void Main()
{
    using (var cn = new SqlConnection("Data Source=MAD-PC-023;Database=atmbd;Trusted_Connection=True;"))
    {
        cn.Open();
        string debitCard = "";
        Console.WriteLine("Insert your card number: ");

        while (true)
        {
            try
            {
                debitCard = Console.ReadLine().Trim();

                if (debitCard.Length != 8)
                {
                    Console.WriteLine("Wrong format!");
                    continue;
                }

                // 使用参数化查询,避免SQL注入同时保证类型匹配
                using (var cmd = new SqlCommand("SELECT FirstName FROM atm WHERE CardNumber = @CardNumber", cn))
                {
                    cmd.Parameters.AddWithValue("@CardNumber", debitCard);
                    var result = cmd.ExecuteScalar();

                    if (result != null)
                    {
                        Console.WriteLine($"Hi, {result}");
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Card not found!");
                    }
                }
            }
            catch (Exception ex)
            {
                // 输出具体异常信息,便于排查真实问题
                Console.WriteLine($"Card verification error: {ex.Message}");
            }
        }

        string pin = "";
        Console.WriteLine("Insert pin: ");

        while (true)
        {
            try
            {
                pin = Console.ReadLine().Trim();

                // 关键:关联卡号+PIN共同验证,符合业务逻辑
                using (var cmd = new SqlCommand("SELECT FirstName, LastName FROM atm WHERE CardNumber = @CardNumber AND Pin = @Pin", cn))
                {
                    cmd.Parameters.AddWithValue("@CardNumber", debitCard);
                    // 如果数据库Pin是数字类型,可改为int.Parse(pin)保证类型匹配
                    cmd.Parameters.AddWithValue("@Pin", pin);

                    var reader = cmd.ExecuteReader();
                    if (reader.Read())
                    {
                        Console.WriteLine($"User Found: {reader.GetString(0)} {reader.GetString(1)}");
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Incorrect PIN!");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"PIN verification error: {ex.Message}");
            }
        }
    }
}

关键修复点

  • 参数化查询:彻底杜绝SQL注入风险,同时保证查询参数与数据库字段类型匹配,避免类型转换异常。
  • 卡号+PIN联合验证:符合ATM的真实验证逻辑,避免PIN重复导致的错误匹配。
  • 精准异常捕获:输出具体异常信息,帮你快速定位问题根源(比如数据库连接失败、字段类型不匹配等)。
  • 输入Trim处理:去除用户输入的前后空格,避免因空格导致的查询失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:10:45