Сохраненный процесс Выходной параметр + Выбрать не передавать обратно выходной параметр - PullRequest
4 голосов
/ 06 мая 2009

У меня есть хранимая процедура, которая возвращает два набора записей, которые я вызываю с помощью 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 ]

5 голосов
/ 16 ноября 2010

Сначала необходимо закрыть ридер, а затем получить выходной параметр. Выходные параметры возвращают ноль, когда читатель открыт.

Более подробную информацию можно найти здесь http://amilagm.com/2010/11/output-variable-values-not-returned-from-sql-server-sp-in-c-sharp/

Надеюсь, это поможет.

4 голосов
/ 11 июня 2009

Самый простой способ получить выходной параметр - использовать инстанцированную переменную. Я имею в виду сохранение ссылки на ваши параметры, а затем, как только вы выполните 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();

Возможно, не используется устройство чтения данных, но вы можете использовать его, чтобы найти правильный ответ. Удачи.

0 голосов
/ 17 ноября 2009

Ответ в том, что вы должны закрыть ридер, прежде чем сможете получить доступ к выходным параметрам.

От: Эта страница

  • Убедитесь, что вы сначала извлекаете набор записей как SqlDataReader через процесс cmd.ExecuteReader () через все наборы записей, а затем ...
  • Убедитесь, что вы ЗАКРЫВАЕТЕ набор записей, или SqlDataReader через reader.Close () перед попыткой получить выходные параметры
0 голосов
/ 06 мая 2009

Немного смущен здесь ... Вы ожидаете выдачи скалярных значений или какого-то набора записей? Получить Reader действительно имеет смысл, если у вас есть, например, некоторый курсор возвращается в качестве параметра out ...

Возможно, вы захотите вызвать «ExecuteNonQuery ()» для вашей команды и убедиться, что вы правильно установили CommandType (CommandType.StoredProcedure)

0 голосов
/ 06 мая 2009

Это дозвуковой сбой, отлично работает в качестве стандартного болота.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...