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

C# 在从c调用的存储过程中有两个输出参数的奇怪行为#,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我已经修改了一个现有的strored程序。它最初在存储过程中有一个ouput参数,在调用它的c#代码中设置如下: cmd.Parameters.Add("@Var1Param", SqlDbType.BigInt); if (Var1 == 0) cmd.Parameters["@Var1"].Value = DBNull.Value; else cmd.Parameters["@Var"].Value =

我已经修改了一个现有的strored程序。它最初在存储过程中有一个ouput参数,在调用它的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());
为了澄清这一点,该参数在存储过程中声明为输出,但在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代码

如您所见,我只想输出第二个参数。将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的值

有什么建议吗?我知道我可以通过拥有多个结果集并将我的输出值放入第二个结果集中来解决这个问题,但我宁愿不处理乱七八糟的问题,除非我不得不这样做。我看过很多关于参数从存储过程返回并在c#中访问后的奇怪状态的帖子。这种行为是bug吗


我将指出,我使用ExecuteOnQuery是因为SP执行更新。Sarbeat正在使用执行标量。我认为这不会有什么区别,但我会问,是否有人知道为什么会发生这种情况。我通过指定sqlparameters的大小修改了代码,现在var2的值显示在var1中,var2为Null


如果您有任何建议,我们将不胜感激。

以下代码似乎工作正常,那么这可能与存储过程中的逻辑有关

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();

我已经考虑过这一可能性,具有讽刺意味的是,我在一个sql论坛上发布了同样的问题,有人告诉我这应该放在一个C论坛上:-)。你列出的代码对我来说很公平,你当然可以通过这种方式使用参数从sql返回值。但是,您只发布了一半代码,另一半在stroded过程中。如果您可以发布SQL,这将有助于识别问题。
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();