Проверьте, существует ли запись в таблице в базе данных через ExecuteNonQuery

в моей программе мне нужно проверить, существует ли запись в базе данных в таблице с помощью инструкции if. используя С#, я пытаюсь сделать это через 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 был инициализирован ранее в основном как int sqlresult; поэтому я хотел бы знать, что если этот пользователь "Адам" существует в базе данных или нет. и если он существует, то я хочу продолжить утверждение "если", например:

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

поэтому я просто не знаю целого числа, которое он должен вернуть, и я либо не уверен, что это правильный способ сделать это.

спасибо.

Ответы

Ответ 1

Если вы хотите проверить, существует ли пользователь, вам нужно изменить свой 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-параметры, чтобы предотвратить 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();
    ...
}

Ответ 2

Вы должны использовать ExecuteScalar для записи, если запись существует. ExecuteNonQuery запускает инструкцию transact-SQL для соединения и возвращает количество строк, затронутых для UPDATE, INSERT или DELETE. Это не относится к операторам SELECT

Ответ 3

Я бы использовал Select Top 1 Id, а не count (*), потому что он может быть намного быстрее

Ответ 4

Вы должны сделать 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 для использования хранимой процедуры.

Ответ 5

Если когда-нибудь вы захотите использовать 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));