0

我正在使用带有数据库 SQL 的 Visual Studio 2010

我的 C# 代码是:

 public void Gettotal(int matreqid)
    {
        int total = 0;
         try
        {
            sqlconnstring = ConfigurationManager.ConnectionStrings["CONERP"].ConnectionString;
            sqlcon = new SqlConnection(sqlconnstring);
            sqlcon.Open();
            sqlcmd = new SqlCommand("GettotalMaterialRequisition", sqlcon);
             sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlda.SelectCommand.Parameters.Add("@matreqid", SqlDbType.BigInt).Value = matreqid;
            sqlcmd.Parameters.Add("@mmtotal", SqlDbType.BigInt).Direction = ParameterDirection.ReturnValue;
            sqlcmd.ExecuteNonQuery();
            total = Convert.ToInt32(sqlcmd.Parameters["@mmtotal"].Value);
            sqlcmd.Dispose();
            sqlcon.Close();
          }

        catch (SqlException sqlerr)
        {

        }

    }

和 SQL 存储过程是

ALTER procedure [dbo].[GettotalMaterialRequisition](@mmtotal bigint OUTPUT, @matreqid bigint)
as
begin

    set @mmtotal = (select( sum (rate * qty  * nooflab)) from MaterialRequisitionList where (matreqid = @matreqid and chkmr = 1))
    RETURN @mmtotal;
end
4

2 回答 2

2

您正在执行一个需要两个参数的存储过程,但您只通过命令传递了一个参数

        sqlcmd = new SqlCommand("GettotalMaterialRequisition", sqlcon);
        sqlcmd.CommandType = CommandType.StoredProcedure;
        sqlcmd.Parameters.Add("@matreqid", SqlDbType.BigInt).Value = matreqid;
        sqlcmd.Parameters.Add("@mmtotal", SqlDbType.BigInt).Direction = ParameterDirection.ReturnValue;
        sqlcmd.ExecuteNonQuery();

第二个参数被添加到数据适配器的选择命令中。该适配器不参与对存储过程的调用。

另外,我希望您不要像上面代码中显示的那样真正吞下异常。捕获异常然后什么都不做是一种非常糟糕的做法,并且可能会隐藏明显的错误

于 2013-10-18T07:15:02.920 回答
2

此位不正确:

sqlcmd.Parameters.Add("@mmtotal", SqlDbType.BigInt).Direction = 
           ParameterDirection.ReturnValue;

你反而想要:

sqlcmd.Parameters.Add("@mmtotal", SqlDbType.BigInt).Direction = 
           ParameterDirection.Output;

(正如@Steve 指出的那样,这一行也应该改变:

sqlda.SelectCommand.Parameters.Add("@matreqid", SqlDbType.BigInt).Value = matreqid;

应该:

sqlcmd.Parameters.Add("@matreqid", SqlDbType.BigInt).Value = matreqid;

)

然后,您可以从存储过程中删除以下行:

RETURN @mmtotal;

存储过程的返回值始终是类型int。您可能已经通过尝试将 abigint放在那里来截断您的价值。


作为文体问题,我还建议将您的OUTPUT参数放在程序的形式参数列表中的最后,但这只是常规的,不是必需的。

于 2013-10-18T07:24:11.170 回答