从c#调用的存储过程中有两个输出参数的奇怪行为

时间:2011-03-29 14:57:02

标签: c# sql-server stored-procedures

我修改了现有的strored过程。它最初在存储过程中有一个输出参数,它在调用它的c#代码中设置如下:

cmd.Parameters.Add("@Var1Param", SqlDbType.BigInt);
if (Var1 == 0)
                cmd.Parameters["@Var1"].Value = DBNull.Value;
            else
                cmd.Parameters["@Var"].Value = Var1;
            cmd.Parameters["@Var1"].Direction = ParameterDirection.InputOutput;
cmd.ExecuteNonQuery();

            // Get Var1
Var1= dataMorph.ToInt64(cmd.Parameters["@Var1"].Value.ToString());

为了澄清,此参数在存储过程中声明为OUTPUT,但在C#代码中声明为inputoutput。这很好。

我在同一个存储过程中添加了另一个参数,我想从C#代码中检索这两个参数。 C#代码现在如下:

  SqlParameter Var1Param;

             if (VAR1 == 0)
                 Var1Param = new SqlParameter("@Var1", DBNull.Value);
             else
                 Var1Param = new SqlParameter("@Var1",Var1) ;

             Var1Param.Direction = ParameterDirection.InputOutput ;
             cmd.Parameters.Add(Var1Param);

此参数再次在存储过程中声明为输出,但在c#代码中声明为inputoutput。 这是新参数。这在存储过程中声明为输出。这是C#代码。

SqlParameter Var2Param = new SqlParameter("@Var2", 0);
            Var2Param.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(Var2Param);

我只想输出你能看到的第二个参数。尽管它只是一个输出变量,但为此参数赋值0似乎是一种标准做法。我不确定是否需要给它一个类型。

现在执行

            // Execute
            cmd.ExecuteScalar();
            connection.Close();

            // Get DonationID
            Var1 = dataMorph.ToInt64(cmd.Parameters["@Var1"].Value.ToString());

            //Get Supersession Daf ID return param to see if new DAF was created
            Var2 = dataMorph.ToInt64(cmd.Parameters["@Var2"].Value.ToString());

var1和vaf2参数都包含分配给存储过程中@ Var2参数的值。我已经读过可以使用任意数量的参数和参数类型,但似乎分配给@ Var2的值会覆盖传入或分配给Var1的值。

有什么建议吗?我知道我可以通过使用多个结果集并将我的输出值放在第二个结果集中来解决这个问题,但除非必须,否则我宁愿不处理Kludges。从存储过程中返回并在c#中访问后,我看到很多关于参数奇怪状态的帖子。这种行为是一种错误吗?


我将指出我正在使用executiontenonquery,因为SP会进行更新。 sarfeast正在使用执行标量。我假设这应该没有任何区别,但我会问是否有人对于为什么会这样做有任何想法。我通过指定sqlparameters的大小来修改代码,现在var2的值显示在var1中,var2是Null !!!

任何建议都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

以下代码似乎运行得很好,所以这或许与存储过程中的逻辑有关?

CREATE PROCEDURE Outs 
    @var1 INT OUTPUT,
    @var2 INT OUTPUT
AS
BEGIN
    SELECT  @var1 = 1,
            @var2 = 2
END
GO

        var connectionstring = @"server=rickshaw;database=becak;Trusted_Connection=true;";

        using(var conn = new SqlConnection(connectionstring))
        using(var cmd = new SqlCommand("Outs", conn))
        {
            try
            {
                cmd.CommandType = CommandType.StoredProcedure;
                conn.Open();

                cmd.Parameters.Add("@var1", SqlDbType.BigInt);
                cmd.Parameters.Add("@var2", 0);

                cmd.Parameters["@var1"].Value = DBNull.Value;
                cmd.Parameters["@var1"].Direction = ParameterDirection.InputOutput;

                cmd.Parameters["@var2"].Value = 0;
                cmd.Parameters["@var2"].Direction = ParameterDirection.Output;

                cmd.ExecuteScalar();
                conn.Close();

                var var1 = cmd.Parameters["@var1"].Value;
                var var2 = cmd.Parameters["@var2"].Value;

                Console.WriteLine("var1=" + var1);
                Console.WriteLine("var2=" + var2);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        Console.ReadLine();