19

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

所以我只是不知道它应该返回的整数,而且我不确定这是不是这样做的正确方法。

谢谢你。

4

5 回答 5

46

如果要检查用户是否存在,则必须更改 sql 并使用COUNTor 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();
    ...
}
于 2013-07-27T22:36:33.847 回答
8

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

于 2013-07-27T22:33:41.647 回答
4

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

于 2016-01-25T19:44:17.637 回答
3

你应该count(1)在桌子上做 a 而不是 aselect *然后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();
            }
        }

请注意,我使用了 equals 值而不是 like 值。

另外,如果我这样做,我会将您的内联 sql 更改为使用存储过程。

于 2013-07-27T22:34:47.397 回答
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));
于 2016-12-12T16:12:55.490 回答