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

时间:2013-07-27 22:30:00

标签: c# sqlcommand

在我的程序中,我需要使用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!");
}

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

谢谢。

5 个答案:

答案 0 :(得分:39)

如果要检查用户是否存在,则必须更改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();
    ...
}

答案 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));