Есть ли в SqlDataReader ошибка. HasRows при выполнении против SQL Server 2008?

Вы можете настроить предупреждение для проверки забытых операторов возврата с помощью комбинации свойств wForgottenReturn и longStackTraces из объекта конфигурации. wForgottenReturn является свойством warning и должно иметь значение true и является единственным типом предупреждения, который можно настроить отдельно. Соответствующий ключ переменной среды - BLUEBIRD_W_FORGOTTEN_RETURN. Вы можете проверить документацию для получения дополнительной информации.

const Bluebird = require('bluebird');

Bluebird.config({
    warnings: {
        wForgottenReturn: true
    }, longStackTraces: true,
});


Bluebird.resolve(1).then(() => {
   Bluebird.resolve(2);
}).then(two => console.log(two));

Запуск программы в консоли дает мне:

Warning: a promise was created in a handler at /home/adrianpop/test/bb.js:11:13 but was not returned from it, see 
    at Function.Promise.cast (/home/adrianpop/Downloads/Test/node_modules/bluebird/js/release/promise.js:196:13)
undefined

, что является желаемым вами результатом.

Вы также можете запустить приложение как:

BLUEBIRD_LONG_STACK_TRACES=1 BLUEBIRD_WARNINGS=1 node app.js, производя тот же результат.

Приветствия!

Редактировать:

Из этого выпуска на github мы имеем:

Итак, проблема в том, что Nodejs 6.x по умолчанию не отображает трассировки стека для предупреждений. Есть опция командной строки (--trace-warnings), чтобы включить их. Без этой опции предупреждения Bluebird намного менее полезны. Без стека вызовов может быть очень трудно выяснить, откуда возникло предупреждение.

blockquote>

Более подробную информацию также можно найти:

20
задан Community 23 May 2017 в 12:19
поделиться

6 ответов

Я - исходный плакат refernced вопроса (потерянный вход в систему) и никогда не умел понять это. В конце я подавил его плохому вуду, принесенной в жертву опрятности и пошел с чем-то как

bool readerHasRows=false;
while(reader.reader())
{
   readerHasRows=true;
   doStuffOverAndOver();
}
if (!readerHasRows)
{
   probablyBetterShowAnErrorMessageThen();
}

, Что было действительно странным, был то, что это работало на одной aspx странице а не на другом несмотря на блоки кода, являющиеся почти идентичной панелью используемая хранимая процедура.

, Само собой разумеется, я избегаю.HasRows с этого времени ;)

РЕДАКТИРОВАНИЕ - выставочные сообщения Studio управления на вкладке сообщений на проблемной процедуре в моем проекте также. Таким образом, это, кажется, причина проблемы. Но почему это испортило бы.HasRows??

EDIT2 - Подтвержденный, изменил запрос для предотвращения предупреждающих сообщений, и .hasrows теперь верен.

6
ответ дан 30 November 2019 в 01:32
поделиться

Это, конечно - странное поведение - но я задаюсь вопросом, почему необходимо проверить HasRows, если Вы собираетесь просто выполнить итерации набора результатов.

HasRows свойство инкапсулирует _hasRows поле, которое вкладывает набор к true или false внутренний SqlDataReader во многих различных местах по многим различным причинам. Большинство этих мест это установлено на true, если частное TdsParserStateObject PeekByte метод возвращает число, которое указывает на данные, присутствует.

2
ответ дан 30 November 2019 в 01:32
поделиться

Как с Andrew I не уверено, почему Вы только не использовали бы цикл с условием продолжения, для предотвращения хита производительности дополнительных вызовов GetOrdinal. Вы могли использовать флаговое значение, чтобы сделать запросы GetOrdinal к первой строке, затем после этого код может быть пропущен.

я заметил подобные проблемы с HasRows в прошлом и перешел к шаблону, подобному шахте, упомянутой выше с минимальными проблемами.

0
ответ дан 30 November 2019 в 01:32
поделиться

Кажется, что HasRows является одним из тех свойств, какое значение, как гарантируют, не будет точно...

я соглашаюсь с предыдущими двумя сообщениями (о движении прямо в то, в то время как (доктор Read ()) и получают ординалы в первом повторении). Кроме того, почему бы не получить набор данных вместо средства чтения данных? Если в этом случае Вы только имеете дело с 20 строками, получение целого набора данных сразу не могло бы быть большой частью хита производительности по сравнению с использованием средства чтения данных. Я знаю, что это действительно не отвечает на Ваш вопрос, но просто мысль для обходного решения.

1
ответ дан 30 November 2019 в 01:32
поделиться

Попробуйте следующее и сообщите, было ли это успешно:

using (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.SingleResult))
0
ответ дан 30 November 2019 в 01:32
поделиться

Я бы предложил вызвать метод NextResult, если есть подозрение, что причиной этой проблемы является несколько наборов результатов. Поскольку первый набор результатов кажется пустым, использование CommandBehavior.SingleResult не изменит поведения, поскольку первый (пустой) результат все равно будет возвращен. Вы можете попробовать это. В любом случае, я слышал, что это ошибка, но не помню, где я ее читал, а быстрый поиск в Google не дал никаких результатов.

0
ответ дан 30 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: