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.