C# изменяет выходной параметр на недопустимое значение и выдает ошибку

С помощью:

  • Visual Studio 2010
  • SQL Server 2012

У меня есть хранимая процедура, которая вставляет новую запись в БД и возвращает новый идентификатор записи в качестве выходного параметра. Я запустил SP вручную, и это работает.

Если я запускаю его из своего приложения C# и впоследствии читаю выходной параметр, C# читает число * вместо числа.

Я изменил sp, чтобы записать выходной параметр в таблицу, прежде чем выводить его. Я всегда получаю правильный идентификатор записи в этой таблице.

Код C#, который читает выходной параметр, используется (без каких-либо изменений) в нескольких других приложениях и работает. Он используется для других sp в этом приложении, и он работает. Тем не менее я добавил код:

public string SpOutputParameter(string sSpName, SpParameter[] oParam, bool 
    bKeepConnectionOpen = false)
{
        // Set return value to -1
        int iReturnValue = -1;

        // SP Command
        SqlCommand Cmd = new SqlCommand(sSpName, this.Db); // Command (exec sp)
        Cmd.CommandType = CommandType.StoredProcedure; // Type of command

        try // Try to get results
        {
            // Add the parameters
            this.AddParameters(oParam, Cmd);
            this.AddReturnValue(Cmd);

            // Get the results
            this.OpenDatabase();
            Cmd.ExecuteNonQuery();

            if (!bKeepConnectionOpen)
                this.Db.Close();

            // Get the return value
            iReturnValue = GetReturnValue(Cmd);

            // If the sp fails, throw an exception (to be caught)
            if (iReturnValue != 0)
                throw new Exception("The database returned a return value of " + Convert.ToString(iReturnValue != 0));

            // Get the output parameter to return
            foreach (SqlParameter parameter in Cmd.Parameters)
            {
                if (parameter.Direction == ParameterDirection.Output ||
                    parameter.Direction == ParameterDirection.InputOutput)
                    return Convert.ToString(parameter.Value);
            }
        }
        catch (Exception Ex)
        {
            // Edit the message, rethrow exception
            throw new Exception(
                "Failed to run sp '" + sSpName + "'",
                Ex);
        }
        finally // Dispose of used objects
        {
            // Dispose the command
            Cmd.Dispose();
            Cmd = null;
        }

        // If the code gets here, there was no output parameter.
        // return null...
        return null;
}

При отладке я вижу значение параметра как * в свойстве parameter.Value. ('вернуть Convert.ToString(parameter.Value);' строка)

На данный момент мое приложение не работает, мне нужно получить значение выходного параметра. Может кто-нибудь помочь мне выяснить, почему я получаю * (в C#) вместо фактического значения выходного параметра?

Спасибо!

3 ответа

Решение

Исходя из вашего объяснения, что ваша хранимая процедура вставляет новую запись и возвращает это значение, а также того факта, что ваш тип возвращаемого значения является строкой, я собираюсь предположить, что ваш выходной параметр - это char или varchar, и вы делаете что-то вроде этого:

SET @VarCharParameter = SCOPE_IDENTITY();

В этом случае, если ваш char/varchar недостаточно велик для хранения int, он станет *например,

SELECT CONVERT(CHAR(2), 10000);

Решением этого является использование правильных типов. Если вы хотите вернуть целое число, используйте INT параметр.

Кажется, это проблема конвертирования некоторых типов. Попробуйте просто разыграть как:

return (string)parameter.Value;

Поскольку используемая хранимая процедура здесь не показана, убедитесь, что OUTPUT ключевое слово используется в StoredProcedure с параметрами, которые необходимо отправить обратно в C#, например> @outputParameter Varchar(100) OUTPUT

Кроме того, при добавлении параметров SQL к объекту cmd в вашем коде на C# убедитесь, что для направления задано вывод, напримерSqlParameter OutputParam = new SqlParameter("@OutputParam", SqlDbType.VarChar); OutputParam.Direction = ParameterDirection.Output; cmd.Parameters.Add(OutputParam);

Наконец, попытайтесь закрыть соединение с базой данных (this.Db.Close()) после того, как вы получите все необходимое от объекта cmd.

Другие вопросы по тегам