как проверить, возвращает ли sqldatareader какое-либо значение

#c# #null #sqldatareader

#c# #null #sqldatareader

Вопрос:

Вот код, который я придумал::

 reader = cmd.ExecuteReader();
reader.Read();
if (reader.Read())
    intQ = int.Parse(reader[0].ToString());
else
    intQ = 0;

txtblck.Text = intQ.ToString();
reader.Close();
  

Но это приводит к тому, что он всегда выполняет else, и если я делаю это:

 reader = cmd.ExecuteReader();
if (reader.Read())
    intQ = int.Parse(reader[0].ToString());
else
    intQ = 0;

txtblck.Text = intQ.ToString();
reader.Close();
  

If всегда возвращает true, как это должно быть сделано?

Комментарии:

1. Очевидно, что результирующий набор не содержит того, что вы ожидаете… Какой запрос вы используете для получения данных из базы данных?

Ответ №1:

Проверьте свойство HasRows. Возможно, это то, что вы ищете (ваш вопрос мне совершенно ясен).

 if( reader.HasRows )
  

HasRows возвращает значение, если результирующий набор содержит записи.
Вы хотите этого добиться?
Или вы хотите знать, содержит ли конкретное поле определенной записи значение?

Как выглядит ваша инструкция SQL?

Комментарии:

1. я тоже думал об этом, но я не знаю почему, это всегда возвращает true, и потому что это выполнило бы intQ = int.Parse(reader[0] . toString()); когда данных нет, он всегда выдает исключение

2. @dreamer Вы уверены, что значение ваших данных не является NULL ? Рассмотрите возможность использования int. Попробуйте PARSE() вместо int.Parse().

3. Ваш ответ кажется хорошим для того, что он на самом деле намеревается спросить, но почему-то не смог его очистить. Однако есть небольшая поправка, HasRows является свойством класса SqlDataReader и, следовательно, не может быть напрямую использовано для объекта, возвращаемого функцией ExecuteReader().

Ответ №2:

reader.Read() переводит считыватель к следующей записи, где считыватель изначально установлен перед первой записью. Если вызов reader.Read() возвращает false, это означает, что не удалось перейти к следующей записи (т. е. текущая запись является последней записью).

Это означает, что если вы хотите прочитать первую запись, вам нужно вызвать ее reader.Read() один раз, и если reader.Read() возвращает false, это означает, что записей не было — вот так:

 using (var reader = cmd.ExecuteReader())
{
    if (reader.Read())
    {
        intQ = int.Parse(reader[0].ToString());
    }
    else
    {
        intQ = 0;
    }
}
txtblck.Text = intQ.ToString();
  

К вашему сведению, int.Parse будет выдано исключение, если первая запись равна нулю — это отличается от наличия нулевых строк. Возможно, вам следует проверить наличие нулевых значений или использовать int.TryParse вместо этого.

Комментарии:

1. но если я использую его один раз, он всегда будет возвращать true,

2. @dreamer Если у вас всегда есть хотя бы 1 запись, то да, она всегда будет возвращаться true .

3. да, но когда он выполняет следующую строку, он выдает исключение из-за неверных данных

4. @dreamer К ВАШЕМУ СВЕДЕНИЮ, если первая запись не является целым числом (например, если это так null ), то int.Parse выдаст ошибку — возможно, вам следует проверить наличие нулевых значений или использовать int.TryParse вместо этого.

5. Я могу подтвердить, что это правильный способ проверки, есть ли запись в наборе или нет. Если Read метод всегда возвращает true , это означает, что у вас всегда есть хотя бы одна запись. Если эта запись не содержит того, что вы ожидаете, вам нужно выяснить, что возвращается из базы данных, чтобы выяснить, как определить, следует ли вам использовать это или нет.

Ответ №3:

Проверка документации MSDN для SqlReader показывает, что у is есть свойство с именем HasRows , которое вы можете использовать.

 if (reader.HasRows)
{
   ...
}
  

Ответ №4:

Read() возвращает следующую строку результирующего набора.

Итак, если вы возвращаете одну строку, первое чтение получает эту строку, а второе чтение () возвращает false, поскольку второй строки нет — поэтому происходит остальное.

Комментарии:

1. но если я использую его один раз, он всегда будет возвращать true,