Сегодня запрос должен вернуть набор результатов через ExcuteReader, и в то же время он хочет вывести параметры. Вначале я не мог получить значение выходных параметров, думая, что в хранимой процедуре произошла ошибка. проверка в анализаторе запросов прошла корректно, и выходные параметры действительно были изменены.
Что еще более загадочно, так это то, что после выдачи исключения при принудительном преобразовании типа вывода его действительно можно получить снова. Это ошибка ado.net? Невозможно представить себе такую страницу. часто используемый API. Это неправильно? Мой код похож на следующий сценарий:
попробуйте {
используя (SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) {
int val = (int)cmd.Parameters[1].Value // Сейчас все еще пусто;
// более
}
}
catch(опыт исключения) {
throw new ApplicationException("Значение выходного параметра: " + cmd.Parameters[1].Value, exp // Теперь можно получить выходное значение);
}
Это очень расстраивает. После часа отладки и отслеживания
я наконец нашел ответ в MSDN:
При использовании объекта Command с хранимой процедурой для свойства CommandType объекта Command можно установить значение StoredProcedure. Если CommandType имеет значение StoredProcedure, вы можете использовать свойство Параметры команды для доступа к входным и выходным параметрам и возвращаемым значениям. Независимо от того, какой метод Execute вызывается, к свойству «Параметры» можно получить доступ. Однако при вызове ExecuteReader возвращаемое значение и выходные параметры не будут доступны до тех пор, пока DataReader не будет закрыт.
ссылка: http://msdn2.microsoft.com/zh-CN/library/tyy0sz6b.aspx
Вот и все. Я чувствую, что MS снова обманул меня. Подумайте об этом, почему у меня нет опыта в обучении? Вы уже изменили документ и
вернулись к нему. Свою собственную среду кода еще можно объяснить.
Потому что при перехвате исключения область использования выскакивает, DataReader автоматически закрывается, и значение выходного параметра естественным образом может быть получено.
Конечно, если вы поместите ловушку try в using, вы все равно не сможете ее получить, поскольку она все еще находится в области использования, а DataReader не закрыт.
Кроме того, MSDN говорит, что доступ к нему возможен только в том случае, если DataReader закрыт, но это не так.
После тестирования можно резюмировать следующее:
1. Для ExecuteReader выходные параметры и возвращаемое значение возвращаются в DataReader как набор результатов, причем этот набор результатов всегда является последним.
2. Согласно 1, когда есть набор результатов, для доступа к выходным параметрам и возвращаемым значениям вам необходимо вызвать NextResult в местоположение набора результатов, соответствующее выходным параметрам и возвращаемым значениям.
3. Согласно 1, когда Execute не возвращает набор результатов, к нему можно получить прямой доступ (обратите внимание, что нет необходимости вызывать Read()).
4. Обратите особое внимание на необходимость вызова NextResult несколько раз, если возвращается несколько наборов результатов. Если количество наборов результатов является динамическим, то возвращаемое значение nextResult() будет ложным;
5. Даже если для ExecuteReader указан параметр CommandBehavior.SingleResult (возвращающий один набор результатов, фактически возвращающий первый набор результатов пакета), выходные параметры возвращаются как набор результатов.
6. При закрытии DataReader (Close()) выходные параметры заполняются и, следовательно, становятся доступными.
7. Поскольку DataReader предназначен только для чтения вперед, даже если выходные параметры получены с помощью метода NextResult перед закрытием DataReader, доступ к предыдущему набору результатов больше невозможен (в некоторых случаях вы можете захотеть динамически управлять набором результатов через выходные данные). параметры посетите).
8. Чтобы решить проблему в 6, вы не можете использовать выходной параметр и напрямую возвращать выходной параметр в качестве первого результата (SELECT @parmname).
Вышеупомянутое - это всего лишь мое собственное резюме, я надеюсь, что несоответствий нет, и это может быть так. полезно новичкам.
ссылка:
http://www.bigcircleboy.net/583a194f-2c2c-4662-9036-4e2f0eb262396084313157728108.html