使用:
我有一个存储过程,它在DB中插入一条新记录并返回新记录ID作为输出参数。我手动运行sp,它可以工作。
如果我从C#应用程序运行它,然后我读取输出参数,C#读取*而不是数字。
我更改了sp以在输出之前将输出参数写入表中。我总是在这张表中得到正确的记录ID。
在其他几个应用程序中使用读取输出参数的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);'line)
目前我的应用无效,我需要获取输出参数的值。有人可以帮我弄清楚为什么我得到*(在C#中)而不是实际的输出参数值?
谢谢!
答案 0 :(得分:2)
根据你的解释,你的存储过程正在插入一个新记录并返回该值,以及你的返回类型是字符串的事实,我猜你的输出参数是char或varchar,你做了什么像这样:
SET @VarCharParameter = SCOPE_IDENTITY();
在这种情况下,如果你的char / varchar不足以存储int,它将变为*
,例如
SELECT CONVERT(CHAR(2), 10000);
解决方法是使用正确的类型。如果您要返回一个整数,请使用INT
参数。
答案 1 :(得分:0)
似乎有些类型转换问题。尝试像以下一样投射:
return (string)parameter.Value;
答案 2 :(得分:0)
由于此处未显示正在使用的存储过程,请确保在StoredProcedure中使用OUTPUT
关键字,并为C#发送回所需的参数
例如> @outputParameter Varchar(100) OUTPUT
同时在C#代码中向cmd对象添加SQL参数时,请检查方向是否设置为输出
e.g。SqlParameter OutputParam = new SqlParameter("@OutputParam", SqlDbType.VarChar);
OutputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(OutputParam);
最后,尝试从cmd对象获得所需的所有内容后关闭数据库连接(this.Db.Close())。