在我的程序中,我需要使用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!");
}
所以我只是不知道它应该返回的整数,我要么不确定这是否是正确的方法。
谢谢。答案 0 :(得分:39)
如果要检查用户是否存在,则必须更改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();
...
}
答案 1 :(得分:7)
如果记录存在,您应该使用ExecuteScalar
进行检查。 ExecuteNonQuery
针对连接运行transact-SQL语句,并返回受UPDATE,INSERT或DELETE影响的行数。它不适用于SELECT语句
答案 2 :(得分:4)
我会使用Select Top 1 Id而不是count(*),因为它可以更快
答案 3 :(得分:3)
您应该在桌面上执行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以使用存储过程。
答案 4 :(得分:0)
如果有一天你想使用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));
}
或者执行通用方法,以便处理多个实体:
public bool EntityExists<T>(Expression<Func<T, bool>> predicate) where T : class, new()
{
return db.Set<T>().Any(predicate);
}
用法:
EntityExists<Users>(x => x.user_name.Equals(userName, StringComparison.InvariantCultureIgnoreCase)
&& x.password.Equals(password, StringComparison.InvariantCultureIgnoreCase));