Проверьте, существует ли запись в таблице в базе данных через 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));