Проблема с хранимой процедурой - PullRequest
2 голосов
/ 30 августа 2010

У меня проблема с доступом к выводу в хранимой процедуре ниже

        DbParameter DbParm = command.CreateParameter();
        DbParm.Direction = ParameterDirection.Output;
        DbParm.ParameterName = "@SomeValue";
        DbParm.DbType = DbType.Int32;
        DbParm.Value = null;
        command.Parameters.Add(DbParm);

После выполнения процедуры

        command.Parameters["@SomeValue"].Value;

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

CREATE PROCEDURE SomeThing
  @SomeValue int OUTPUT,
AS

  SELECT @SomeValue=ID  
    FROM SomeTable
   WHERE ID=10;

  SELECT * 
    FROM SomeTable;

GO

Ответы [ 2 ]

4 голосов
/ 30 августа 2010

РЕДАКТИРОВАТЬ: Я думаю, что я вижу проблему сейчас.SQL Server не назначает выходные параметры до завершения процедуры.Пока второй выбор потоковый, выходной параметр не будет возвращен клиенту.

Теперь я предполагаю, что вы вызываете ExecuteNonQuery, который не запрашивает набор результатов.SQL Server остановит процедуру в начале второго выбора.

Если вы измените свой код C # на ExecuteReader(), вы можете получить выходной параметр после того, как считыватель будет сделан:

using (var read = yourCommand.ExecuteReader())
    while (read.Read());
// You should be able to access the output parameter here

Если вы добавите больше потоковых селекторов в процедуру:

SELECT * FROM SomeTable where id = 1;
SELECT 'hello world';
SELECT * FROM SomeTable where null in (1,2,3);

Вы должны получить их всех с помощью NextResult:

using (var read = yourCommand.ExecuteReader()) {
    do {
         while (read.Read());
    } while (read.NextResult());
}

перед выходным параметромбудет назначен.Причина этого заключается в том, что значение выходного параметра может зависеть от последнего выбора.Таким образом, SQL Server не знает правильного значения до завершения выполнения всей хранимой процедуры.

0 голосов
/ 30 августа 2010

Я никогда не использовал объекты dbparameter, только объекты system.data.sqlclient.sqlparameter для передачи параметров хранимой процедуре на SQL-сервере. Вместо этого попробуйте SqlParameter.

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