为什么输出参数在c#级别返回0?
我试图从存储过程中获取输出,但在C#中,它给了我0为什么输出参数在c#级别返回0?,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,我试图从存储过程中获取输出,但在C#中,它给了我0 public short SelectOccupantTypesByOccupantTypeID(Int64 OccupantID) { SqlCommand SqlCom = new SqlCommand("SelectOccupantTypesByOccupantTypeID", DatabaseConnection.OpenConnection());
public short SelectOccupantTypesByOccupantTypeID(Int64 OccupantID)
{
SqlCommand SqlCom = new SqlCommand("SelectOccupantTypesByOccupantTypeID", DatabaseConnection.OpenConnection());
SqlCom.CommandType = CommandType.StoredProcedure;
SqlCom.Parameters.AddWithValue("@pk_Occupants_OccupantID", OccupantID);
SqlParameter sqlParamOccupantTypeID = new SqlParameter("@OccupantTypeID", SqlDbType.SmallInt);
sqlParamOccupantTypeID.Direction = ParameterDirection.Output;
SqlCom.Parameters.Add(sqlParamOccupantTypeID);
short OccupantTypeID = Convert.ToInt16(sqlParamOccupantTypeID.Value);
SqlCom.ExecuteNonQuery();
DatabaseConnection.CloseConnection();
return OccupantTypeID;
}
试图得到它
protected void ddlOccupants_SelectedIndexChanged(object sender, EventArgs e)
{
Int64 OccupantID= Convert.ToInt64(ddlOccupants.SelectedValue);
Int16 OccupantTypeID= MngOccupants.SelectOccupantTypesByOccupantTypeID(OccupantID);
txtBoxMonthlyInstallment.Text = OccupantTypeID.ToString();
}
SP:
但是sp在sql级别返回正确的值,但在C#级别返回0。为什么?如果在执行查询之前正在读取参数值,请交换顺序
SqlCom.ExecuteNonQuery();
short OccupantTypeID = Convert.ToInt16(sqlParamOccupantTypeID.Value);
不管你有什么“坏习惯”,你的连接确实应该用
语句包装在中,而不是在整个程序中重复使用。ADO.NET已经实现了,您不需要自己实现,只需根据需要建立短期连接,当您处理这些连接时,它们将返回到池。您需要在读取值之前调用ExecuteNonQuery
。仔细检查正在传递的参数并获取数据逻辑。如果DBMS说它返回零,那么它将返回零。请务必使用“轮廓”工具。这不一定正确。如果整数的值没有被db调用覆盖,它将返回默认值,对于整数类型,默认值为0,这意味着petelids comment就是答案。我现在读C#的时间太长了。。。我想就大写的局部变量批评你:)@DavidL正如我所说的,检查fething逻辑(这似乎是问题所在)。我所说的是:DBMS不会根据调用它的人来改变行为,除非您为此创建某种规则。如果你通过了完全相同的参数,那么你在测试中获得的数据与你在应用中获得的数据相同。谢谢,但这种做法从未造成任何问题,由于我的软件多年来一直在企业级运行,没有任何问题,因此您很幸运,没有一个程序在打开和关闭调用之间不断抛出异常,导致连接打开,但从未关闭,耗尽了与Sql Server的所有可用连接。至少我建议您开始使用try finally
块,并将DatabaseConnection.CloseConnection()
放在finally块中。
SqlCom.ExecuteNonQuery();
short OccupantTypeID = Convert.ToInt16(sqlParamOccupantTypeID.Value);