C# 将输出参数更改为无效值并抛出错误

C# changes output parameter to invalid value and throws error

使用:

我有一个存储过程,它在数据库中插入一条新记录,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())。