Проверка наличия нулевого типа данных
Следующий код - это то, что я использовал для извлечения информации о пользователе из базы данных sql.
string userName = LoginUser.UserName;
string password = LoginUser.Password;
string comm = "SELECT Username,Password,Clientname,Role FROM Users WHERE Username = '" + userName + "';";
bool rememberUserName = LoginUser.RememberMeSet;
SqlConnection conn = new SqlConnection(connstring);
conn.Open();
SqlCommand command = new SqlCommand(comm, conn);
SqlDataAdapter da = new SqlDataAdapter(command);
DataTable dt = new DataTable();
da.Fill(dt);
DataRow dr = dt.NewRow();
if (dt != null)
{
//logic
}
Однако (dt!= null) не возвращает false, если в базе данных нет записи с именем пользователя, равным LoginUser.Username. Есть ли другой способ проверить, успешна ли команда sql?
Ответы
Ответ 1
Вы получите пустой DataTable
, если никакие записи не совпадают, поэтому вы можете проверить количество возвращенных записей:
if (dt.Rows.Count > 0)
И, немного не по теме, пожалуйста, прочитайте комментарии ниже своего вопроса, а затем в Google сформулируйте SQL-запросы и индексированные SQL-запросы. Попробуйте начать с this.
Ответ 2
Почему бы просто не немного изменить инструкцию, чтобы увидеть, является ли DataTable нулевым или не имеет строк:
if(dt != null && dt.Rows.Count > 0)
Кроме того, на боковой ноте вы также должны изучить Parameterized Queries, а не динамически строить свой SQL. Это уменьшит количество векторов атаки для злоумышленников, пытающихся скомпрометировать ваше приложение.
Ответ 3
Мне кажется, что использование DataTable и SqlDataAdapter немного тяжело для задачи.
Здесь вы можете просто использовать DataReader:
SqlCommand command = new SqlCommand(comm, conn);
using (var reader = command.ExecuteQuery())
{
if (reader.Read())
{
//logic
var userName = reader.GetString(0);
var password = reader.GetString(1);
// etc
}
}
Ответ 4
Лучше, если вы используете try catch
для проверки, является ли таблица пустой или нет, просто обработайте исключение IndexOutOfRangeException
.
Используйте следующую логику:
try
{
//dataTable operations
}
catch(IndexOutOfRangeException)
{
}
Для меня это работает.
Ответ 5
Для DataSet
вы можете проверить так:
if (ds.Tables[0].Rows.Count > 0)
Ответ 6
Я знаю, что этот вопрос СТАРЫЙ, и ответы помогли в тот момент, когда он был опубликован, но сейчас есть простой способ решить эту проблему следующим образом:
if ((dataTableName?.Rows?.Count ?? 0) > 0)
Ответ 7
Начиная с С# 6.0 вы можете использовать условный оператор Null ?.
(или ?[]
для массивов).
Условный оператор NULL упрощает оператор до:
if (dt?.Rows?.Count > 0)
Это возвращает ложь, когда:
- таблица данных
dt
равна нулю - таблица данных
dt.Rows
равна нулю - количество строк
dt.Rows.Count
равно 0
Используя условный оператор null, вы можете избежать ручной проверки как таблицы данных, так и свойств count, например, if (dt != null && dt.Rows.Count > 0)