通过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并使用COUNT
或EXISTS
:
而不是
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));