通过ExecuteNonQuery检查数据库中是否存在表中的记录

在我的程序中,我需要使用if语句检查表中if已存在数据库中的记录。 使用c#我试图通过SQL连接来做到这一点。 因为我认为ExecuteNonQuery(); 命令返回一个整数值,如果我的假设为真,我想知道什么值是真的知道表中是否存在某条记录。 这是我的代码示例:

 using (SqlConnection sqlConnection = dbUtil.GetSqlConnection(dbUtil.GetConnectionStringByName("NonConnectionString"))) { using (SqlCommand sqlCommand = new SqlCommand("SELECT * from users where user_name like 'Adam' AND password like '123456'", sqlConnection)) { sqlresult = sqlCommand.ExecuteNonQuery(); } } 

考虑到sqlresult之前在main中初始化为int sqlresult; 所以我想知道,如果这个用户’Adam’存在于数据库中。 如果他存在,那么我想继续进行’if’声明,例如:

 if(sqlresult == 0) { MessageBox.Show("Adam exists!"); } 

所以我只是不知道它应该返回的整数,我要么不确定这是正确的方法来做到这一点。

谢谢。

如果要检查用户是否存在,则必须更改sql并使用COUNTEXISTS

而不是

 SELECT * from users where user_name like 'Adam' AND password like '123456' 

这个

 SELECT COUNT(*) from users where user_name like 'Adam' AND password like '123456' 

现在,您可以使用ExecuteScalar来检索具有此用户名和密码的用户数:

 int userCount = (int) sqlCommand.ExecuteScalar(); if(userCount > 0) // user exists .... 

请注意,您应该使用sql-parameters来阻止sql-injection :

 using (SqlCommand sqlCommand = new SqlCommand("SELECT COUNT(*) from users where user_name like @username AND password like @password", sqlConnection)) { sqlConnection.Open(); sqlCommand.Parameters.AddWithValue("@username", userName); sqlCommand.Parameters.AddWithValue("@password", passWord); int userCount = (int) sqlCommand.ExecuteScalar(); ... } 

如果记录存在,您应该使用ExecuteScalar进行检查。 ExecuteNonQuery针对连接运行transact-SQL语句,并返回受UPDATE,INSERT或DELETE影响的行数。 它不适用于SELECT语句

您应该在表上执行count(1)而不是select *然后executescalar以获取该整数值。

使用现有代码我会将其更改为:

 using (SqlConnection sqlConnection = dbUtil.GetSqlConnection(dbUtil.GetConnectionStringByName("NonConnectionString"))) { using (SqlCommand sqlCommand = new SqlCommand("SELECT count(1) from users where user_name = 'Adam' AND password = '123456'", sqlConnection)) { sqlresult = sqlCommand.ExecuteNonQuery(); } } 

请注意,我使用了等于值而不是类似的值。

此外,如果我这样做,我会更改您的内联SQL以使用存储过程。

我会使用Select Top 1 Id而不是count(*),因为它可以更快

如果有一天你想使用EF只做:

 private MyDb db = new MyDb(); public bool UserExists(string userName, string password){ return db.Users.Any(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase) && x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase)); } 

或者做一个通用的方法,这样你就可以处理多个entites:

 public bool EntityExists(Expression> predicate) where T : class, new() { return db.Set().Any(predicate); } 

用法:

 EntityExists(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase) && x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase));