как проверить, возвращает ли sqldatareader какое-либо значение - PullRequest
0 голосов
/ 30 апреля 2011

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

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();

Если всегда возвращать true, как это сделать?

Ответы [ 4 ]

8 голосов
/ 30 апреля 2011

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

if( reader.HasRows )

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

Как выглядит ваш SQL-оператор?

3 голосов
/ 30 апреля 2011

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();

FYI int.Parse сгенерирует исключение, если первая запись пуста - это отличаетсяот нуля строк.Возможно, вам следует проверить нулевые значения или использовать int.TryParse.

1 голос
/ 30 апреля 2011

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

if (reader.HasRows)
{
   ...
}
0 голосов
/ 30 апреля 2011

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

Таким образом, если вы возвращаете одну строку, первое чтение получает эту строку, а второе Read () возвращает false, поскольку второй строки нет - так чтоеще случается.

...