我正在使用带有数据库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
答案 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
参数最后放在程序的正式参数列表中,但这只是传统的,不是必需的。