C#开发ATM时检查SQL表中卡号是否存在遇问题求助
问题排查与修正
你的checkifExist方法存在几个关键问题,导致无法正确判断卡号是否存在:
核心错误点
- 参数不匹配:方法接收的参数是
int number,但代码中绑定参数时用的是cardnumber,实际传入的卡号没有被正确传递到SQL查询中。 - 错误的查询执行与判断逻辑:
- 已经通过
ExecuteScalar()获取了卡号计数cardExist,却又调用ExecuteNonQuery()重复执行查询,完全没必要;而且ExecuteNonQuery()对SELECT语句返回-1,用它和卡号对比的逻辑完全错误。 - 判断逻辑颠倒:
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); } } }
额外说明
- 方法名改为
CheckIfExist符合C#帕斯卡命名规范。 using语句会在代码块结束后自动关闭并释放数据库连接,避免资源泄漏。- 直接根据
cardExistCount的值判断:大于0表示卡号已存在,返回true;否则返回false,逻辑清晰准确。
内容的提问来源于stack exchange,提问作者ErrorX
相关产品推荐
相关产品推荐

