2013-10-18 44 views
0

我使用Visual Studio 2010與SQL數據庫的ExecuteNonQuery()在asp.net不工作

我的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 
+0

你得到什麼類型的錯誤? – coder

回答

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命令中。該適配器不參與對存儲過程的調用。

此外,我希望你不會真的吞下你在上面的代碼中顯示的異常。捕獲異常,然後用它做什麼是一個非常不好的做法,並可能隱藏明顯的錯誤

2

此位是不正確的:

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

你,而不是想:

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

(正如@史蒂夫指出,這條線也應該改變:

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

應該是:

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

然後,您可以從您的存儲過程中刪除以下行:

RETURN @mmtotal; 

從一個存儲過程返回int類型始終。您可能試圖將bigint放在那裏來截斷您的價值。


作爲一種文體的事,我也建議把你的OUTPUT參數最後在程序正式的參數列表,但是這只是傳統的,不是必需的。

+0

+1沒有注意到這個方向 – Steve