Возвращаемое значение хранимой процедуры в C # возвращает ошибку - PullRequest
1 голос
/ 25 ноября 2010

Я пытаюсь получить возвращаемое значение хранимой процедуры в SQL Server 2005 следующим образом:

        OleDbCommand comm = new OleDbCommand(process_name, connection);
        comm.CommandType = CommandType.StoredProcedure;

        for (int i = 0; i < process_parameters.Length; i++)
            comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value);

        //Add output param
        comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue;

        comm.ExecuteNonQuery();

Однако, когда вызывается ExecuteNonQuery (), я получаю OleDbException , говорящее: «В процедуре или функции myStoredProcedure указано слишком много аргументов.» Моя хранимая процедура начинается следующим образом:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT]
(
            @Param1     char (64),
            @Param2     char (128),
            @Param3     char (64),
)
AS
BEGIN
    Declare     @TestID         int

И заканчивается следующим:

    RETURN @TestID
END

Имеет ли какое-то отношение тот факт, что возвращаемое значение объявлено, а не передано в качестве параметра? Если так, как я могу получить возвращаемое значение параметра, объявленного после начала хранимой процедуры? Спасибо за вашу помощь.

UPDATE: Я попробовал предложенные изменения и добавил следующую строку:

            OleDbCommand comm = new OleDbCommand(process_name, connection);
            comm.CommandType = CommandType.StoredProcedure;

            for (int i = 0; i < process_parameters.Length; i++)
                comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value);

            var testID = (int)comm.ExecuteScalar();

Теперь, когда ExecuteScalar() выполняется, я получаю NullReferenceException с Ссылка на объект не установлена ​​на экземпляр объекта .

Примечание: я также попытался установить его в целое число int testID = (int)comm.ExecuteScalar();, и я все еще получаю ту же ошибку.

Ответы [ 6 ]

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

Изменить

 comm.ExecuteNonQuery();

на

 int returnValue =  (int) comm.ExecuteScalar();

и удалить:

  comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue;
0 голосов
/ 19 января 2016

У меня была такая же проблема, проблема в том, что вы должны объявить возвращаемый параметр first (перед входным и выходным), таким образом он работает:

OleDbCommand comm = new OleDbCommand(process_name, connection);
comm.CommandType = CommandType.StoredProcedure;

//Add the return param first
comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue;

for (int i = 0; i < process_parameters.Length; i++)
    comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value);

comm.ExecuteNonQuery();
Object return_value = comm.Parameters["@TestID"].Value;
0 голосов
/ 26 марта 2014

В ответ на принятый ответ ...

Поскольку вы устанавливаете для параметра Direction значение ReturnValue здесь:

comm.Parameters.Add("@ReturnValue", OleDbType.Integer).Direction = ParameterDirection.ReturnValue;

Вам не нужно OUTPUT параметр в вашей хранимой процедуре вообще.Вы можете изменить его обратно на:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT]
(
        @Param1     char (64),
        @Param2     char (128),
        @Param3     char (64),
)
AS
BEGIN
    Declare     @TestID         int

С:

    RETURN @TestID
END

в конце, и он все равно будет работать точно так же, как сейчас.

Это чисто случайно означает, что ваш ReturnValue Parameter в C # имеет то же имя, что и ваш параметр OUTPUT.Для параметров OUTPUT есть отдельный параметр Direction.

0 голосов
/ 25 ноября 2010

Хорошо, я смог заставить его работать должным образом.Моя проблема заключалась в том, что я забыл объявить любой из параметров как OUTPUT, добавил дополнительную переменную и установил ее как выходную переменную, а хранимая процедура вернула его.После слова я только что проверил этот выходной параметр, после вызова хранимой процедуры, из моего кода C #, следующие изменения показывают:

ALTER PROCEDURE [dbo].[spTabtempTestsINSERT]
(
            @Param1     char (64),
            @Param2     char (128),
            @Param3     char (64),
            @ReturnValue int OUTPUT
)
AS
BEGIN
    Declare     @TestID         int

И в конце внесите простое изменение:

    SET @ReturnValue = @TestID
    RETURN @ReturnValue
END

Наконец, вернемся к моему коду:

        OleDbCommand comm = new OleDbCommand(process_name, connection);
        comm.CommandType = CommandType.StoredProcedure;

    for (int i = 0; i < process_parameters.Length; i++)
        comm.Parameters.AddWithValue(process_parameters[i].ParameterName, process_parameters[i].Value);

       //Add output param
        comm.Parameters.Add("@ReturnValue", OleDbType.Integer).Direction = ParameterDirection.ReturnValue;

        comm.ExecuteNonQuery();
        Console.WriteLine("Stored Procedure returned a value of "+ comm.Parameters["@ReturnValue"].Value); //Success

Спасибо всем за ваши предложения.Любые альтернативы или дальнейшие идеи приветствуются.

0 голосов
/ 25 ноября 2010

удалите их:

 //Add output param
        comm.Parameters.Add("@TestID", OleDbType.Integer).Direction = ParameterDirection.ReturnValue;

        comm.ExecuteNonQuery();

и используйте вместо этого: var testID = (int) comm.ExecuteScalar();

0 голосов
/ 25 ноября 2010

Я думал, что ExecuteNonQuery () ничего не возвращает из SQL ..... я что-то здесь упускаю?

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