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

C#开发ATM时检查SQL表中卡号是否存在遇问题求助

问题排查与修正

你的checkifExist方法存在几个关键问题,导致无法正确判断卡号是否存在:

核心错误点

  • 参数不匹配:方法接收的参数是int number,但代码中绑定参数时用的是cardnumber,实际传入的卡号没有被正确传递到SQL查询中。
  • 错误的查询执行与判断逻辑:
    1. 已经通过ExecuteScalar()获取了卡号计数cardExist,却又调用ExecuteNonQuery()重复执行查询,完全没必要;而且ExecuteNonQuery()对SELECT语句返回-1,用它和卡号对比的逻辑完全错误。
    2. 判断逻辑颠倒:cardExist > 0才表示卡号已存在,你的代码逻辑完全搞反了。
  • 冗余代码与连接管理问题:定义了DataTable dt但未使用;手动多次关闭连接可能引发异常,应该用using语句自动管理数据库连接生命周期。

修正后的代码

bool CheckIfExist(int cardNumber) {
    string queryString = "select Count(*) from dbo.User_Card_Information where [CardNumbers] = @cardnumbers";
    
    // 使用using自动管理连接,无需手动close
    using (var cnn = new SqlConnection(connectionString))
    {
        try
        {
            cnn.Open();
            SqlCommand checkCardNumberCmd = new SqlCommand(queryString, cnn);
            checkCardNumberCmd.Parameters.AddWithValue("@cardnumbers", cardNumber);
            
            // 只执行一次查询,获取计数
            int cardExistCount = (int)checkCardNumberCmd.ExecuteScalar(); 
            
            if (cardExistCount > 0)
            {
                Console.WriteLine("This Card Number already exist!");
                return true;
            }
            else
            {
                Console.WriteLine("Card number is available!");
                return false;
            }
        }
        catch (SqlException ex)
        {
            string msg = "Fetch Error: " + ex.Message;
            throw new Exception(msg);
        }
    }
}

额外说明

  1. 方法名改为CheckIfExist符合C#帕斯卡命名规范。
  2. using语句会在代码块结束后自动关闭并释放数据库连接,避免资源泄漏。
  3. 直接根据cardExistCount的值判断:大于0表示卡号已存在,返回true;否则返回false,逻辑清晰准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:05:23