C#将输出参数更改为无效值并抛出错误
使用:C#将输出参数更改为无效值并抛出错误,c#,sql,sql-server,stored-procedures,output-parameter,C#,Sql,Sql Server,Stored Procedures,Output Parameter,使用: VisualStudio2010 SQL Server 2012 我有一个存储过程,它在数据库中插入一条新记录,并将新记录ID作为输出参数返回。我手动运行了sp,它正常工作 如果从C#应用程序运行它,然后读取输出参数,C#将读取a*,而不是数字 我更改了sp,在输出前将输出参数写入表中。我总是在此表中获得正确的记录ID 读取输出参数的C#代码在其他几个应用程序和工程中使用(没有任何更改)。它用于此应用程序中的其他sp,并且可以正常工作。尽管如此,我还是添加了代码: public st
- VisualStudio2010
- SQL Server 2012
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属性中将参数的值视为*。('return Convert.ToString(parameter.Value);'行)
目前我的应用程序无法运行,我需要获取输出参数的值。有人能帮我弄清楚为什么我得到的是*(C#)而不是实际的输出参数值吗
谢谢大家! 这似乎是一些类型转换问题。试着像这样施展:
return (string)parameter.Value;
根据您对存储过程插入新记录并返回该值的解释,以及您的返回类型为string的事实,我猜您的输出参数是char或varchar,您可以这样做:
SET @VarCharParameter = SCOPE_IDENTITY();
在这种情况下,如果您的char/varchar不够大,无法存储int,它将变成*
,例如
SELECT CONVERT(CHAR(2), 10000);
解决方法是使用正确的类型。如果要返回整数,请使用
INT
参数。由于此处未显示正在使用的存储过程,请确保在StoredProcess中使用OUTPUT
关键字,并返回C所需的参数#
e、 g.>@outputParameter Varchar(100)输出
另外,在C#代码中将SQL参数添加到cmd对象时,请检查方向是否设置为output
e、 g.SqlParameter OutputParam=新的SqlParameter(“@OutputParam”,SqlDbType.VarChar);
OutputParam.Direction=ParameterDirection.Output;
cmd.Parameters.Add(OutputParam)代码>
最后,在从cmd对象获得所需的一切后,尝试关闭数据库连接(this.Db.close()。这似乎是一些类型转换问题。调用“Convert.ToString”时,“parameter.Value”的类型是什么?尝试像“return(string)parameter.Value”这样的强制转换;是否可能是从一个字节强制转换到另一个字符串或类似的内容?是否可以共享GetReturnValue(Cmd)
;代码?输出参数的SQL数据类型是什么?请尝试从SSMS执行proc,以查看是否返回了*
。在存储过程中,是否有另一个类型为Output或InputOutput的参数在您要从中获取值的参数之前返回值?谢谢。有了这个答案,我就知道问题出在哪里了。结果是,我将输出参数定义为错误的类型(DBtype)。