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
我有一个存储过程,它在数据库中插入一条新记录,并将新记录ID作为输出参数返回。我手动运行了sp,它正常工作

如果从C#应用程序运行它,然后读取输出参数,C#将读取a*,而不是数字

我更改了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属性中将参数的值视为*。('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)。