asp.net中的ExecuteNonQuery()不起作用

时间:2013-10-18 07:05:43

标签: asp.net sql-server

我正在使用带有数据库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

2 个答案:

答案 0 :(得分: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();

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

此外,我希望您不会像上面的代码中那样显示异常。捕获异常然后对其执行任何操作都是一种非常糟糕的做法,可能会隐藏明显的错误

答案 1 :(得分: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;

存储过程中的 return 值始终为int类型。您可能试图在其中放置bigint来截断您的价值。


作为一个风格问题,我还建议将你的OUTPUT参数最后放在程序的正式参数列表中,但这只是传统的,不是必需的。