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

时间:2017-11-29 13:55:02

标签: c# sql sql-server stored-procedures output-parameter

使用:

  • Visual Studio 2010
  • SQL Server 2012

我有一个存储过程,它在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#中)而不是实际的输出参数值?

谢谢!

3 个答案:

答案 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())。