Сохраненный процесс Выходной параметр + Выбрать не передавать обратно выходной параметр
У меня есть хранимая процедура, которая возвращает два набора записей, которые я вызываю с помощью GetReader. Я повторяю первое, вызываю IDataReader.NextResult(), затем повторяю второе.
Я присваиваю значения выходным параметрам в sp, но когда я проверяю значения после окончания чтения, мои выходные параметры равны нулю. Похоже, ошибка. Я не хочу использовать выбор, так как я не люблю выдумки. Некоторые фрагменты...
...
sp.Command.AddParameter("@SelectedTabID", selectedTabID, DbType.Int32);
sp.Command.AddParameter("@CurrentTabID", 0, DbType.Int32, ParameterDirection.Output);
sp.Command.AddParameter("@TypeID", 0, DbType.Int32, ParameterDirection.Output);
(обратите внимание, что при этом или использовании AddOutputParameter() получаются те же результаты)
...
using(IDataReader reader = sp.GetReader())
{
while (reader.Read()) {...}
if (reader.NextResult()) {while (reader.Read()) {...}}
}
...
int one = (int)sp.OutputValues[0]; //null expected an int
int two = (int)sp.OutputValues[1]; //null expected an int
Ждем некоторых жемчужин мудрости:)
5 ответов
Сначала необходимо закрыть ридер, а затем получить выходной параметр. Выходные параметры возвращают ноль, когда читатель открыт.
Более подробную информацию можно найти здесь http://amilagm.com/2010/11/output-variable-values-not-returned-from-sql-server-sp-in-c-sharp/
Надеюсь это поможет.
Самый простой способ получить выходной параметр - использовать инстанцированную переменную. Я имею в виду сохранение ссылки на ваши параметры, затем, как только вы выполните sproc, вы можете проверить их следующим образом:
SqlCommand cmd = new SqlCommand();
cmd.Connection = ConfigurationManager.ConnectionStrings["MyCon"].ToString();
cmd.CommandText = "MySproc";
SqlParameter parmOut = new SqlParameter("@StuffIWant", SqlDbType.Int);
parmOut.Direction=ParameterDirection.Output;
cmd.Parameters.Add(parmOut);
cmd.ExecuteNonQuery();
string theThingIWant = parmOut.Value.ToString();
Возможно, вы не используете хранилище данных, но вы можете использовать это, чтобы найти правильный ответ. Удачи.
Ответ в том, что вы должны закрыть ридер, прежде чем сможете получить доступ к выходным параметрам.
От: эта страница
- Убедитесь, что вы сначала извлекаете набор записей как SqlDataReader с помощью cmd.ExecuteReader() Обрабатываете все наборы записей, а затем...
- Убедитесь, что вы ЗАКРЫВАЕТЕ набор записей или SqlDataReader через reader.Close(), прежде чем пытаться получить выходные параметры
Это дозвуковой сбой, отлично работает как болотный стандарт SQLConnection/Command
Немного смущен здесь... Вы ожидаете выдачи скалярных значений или какого-то набора записей? Get Reader действительно имеет смысл, если у вас есть, например, какой-нибудь курсор, возвращающийся в качестве параметра out...
Возможно, вы захотите вызвать "ExecuteNonQuery()" в своей команде и убедиться, что вы правильно установили CommandType (CommandType.StoredProcedure)