Проверка наличия нулевого типа данных

Следующий код - это то, что я использовал для извлечения информации о пользователе из базы данных 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)

Это возвращает ложь, когда:

  1. таблица данных dt равна нулю
  2. таблица данных dt.Rows равна нулю
  3. количество строк dt.Rows.Count равно 0

Используя условный оператор null, вы можете избежать ручной проверки как таблицы данных, так и свойств count, например, if (dt != null && dt.Rows.Count > 0)