C# 将输出参数更改为无效值并抛出错误
C# changes output parameter to invalid value and throws error
使用:
- Visual Studio 2010
- SQL 服务器 2012
我有一个存储过程,它在数据库中插入一条新记录,returns 新记录 ID 作为输出参数。我 运行 手动 sp 并且它有效。
如果我从我的 C# 应用程序 运行 它,然后我读取输出参数,C# 读取一个 *,而不是数字。
我改sp把输出参数写成一个table再输出。我总是在 table.
中得到正确的记录 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 属性 上显示为 *。 ('return Convert.ToString(parameter.Value);' 行)
目前我的应用程序无法运行,我需要获取输出参数的值。有人能帮我弄清楚为什么我得到的是 *(在 C# 中)而不是实际的输出参数值吗?
谢谢!
这似乎是某些类型转换的问题。尝试像这样投射:
return (string)parameter.Value;
根据您的解释,即您的存储过程正在插入一条新记录并 returning 该值,并且您的 return 类型是字符串这一事实,我猜测您的输出参数是一个 char 或 varchar,你做这样的事情:
SET @VarCharParameter = SCOPE_IDENTITY();
在这种情况下,如果您的 char/varchar 不够大,无法存储 int,它将变为 *
,例如
SELECT CONVERT(CHAR(2), 10000);
解决这个问题的方法是使用正确的类型。如果您要 return 整数,请使用 INT
参数。
由于此处未显示正在使用的存储过程,因此请确保在 StoredProcedure 中使用了 OUTPUT
关键字以及需要为 C# 发回的参数
例如> @outputParameter Varchar(100) OUTPUT
此外,在 C# 代码中向 cmd 对象添加 SQL 参数时,检查方向是否设置为输出
例如SqlParameter OutputParam = new SqlParameter("@OutputParam", SqlDbType.VarChar);
OutputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(OutputParam);
最后,在从 cmd 对象获得所需的一切后,尝试关闭数据库连接 (this.Db.Close())。
使用:
- Visual Studio 2010
- SQL 服务器 2012
我有一个存储过程,它在数据库中插入一条新记录,returns 新记录 ID 作为输出参数。我 运行 手动 sp 并且它有效。
如果我从我的 C# 应用程序 运行 它,然后我读取输出参数,C# 读取一个 *,而不是数字。
我改sp把输出参数写成一个table再输出。我总是在 table.
中得到正确的记录 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 属性 上显示为 *。 ('return Convert.ToString(parameter.Value);' 行)
目前我的应用程序无法运行,我需要获取输出参数的值。有人能帮我弄清楚为什么我得到的是 *(在 C# 中)而不是实际的输出参数值吗?
谢谢!
这似乎是某些类型转换的问题。尝试像这样投射:
return (string)parameter.Value;
根据您的解释,即您的存储过程正在插入一条新记录并 returning 该值,并且您的 return 类型是字符串这一事实,我猜测您的输出参数是一个 char 或 varchar,你做这样的事情:
SET @VarCharParameter = SCOPE_IDENTITY();
在这种情况下,如果您的 char/varchar 不够大,无法存储 int,它将变为 *
,例如
SELECT CONVERT(CHAR(2), 10000);
解决这个问题的方法是使用正确的类型。如果您要 return 整数,请使用 INT
参数。
由于此处未显示正在使用的存储过程,因此请确保在 StoredProcedure 中使用了 OUTPUT
关键字以及需要为 C# 发回的参数
例如> @outputParameter Varchar(100) OUTPUT
此外,在 C# 代码中向 cmd 对象添加 SQL 参数时,检查方向是否设置为输出
例如SqlParameter OutputParam = new SqlParameter("@OutputParam", SqlDbType.VarChar);
OutputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(OutputParam);
最后,在从 cmd 对象获得所需的一切后,尝试关闭数据库连接 (this.Db.Close())。