为什么在c#级输出参数返回0?
我想从存储过程输出,但在C#它给了我0.1为什么在c#级输出参数返回0?
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:
alter PROCEDURE [dbo].[SelectOccupantTypesByOccupantTypeID]
@pk_Occupants_OccupantID bigint,
@OccupantTypeID smallint output
AS
BEGIN
Set @OccupantTypeID= (Select Occupants.OccupantsOccupantTypeID
From Occupants
Where Occupants.pk_Occupants_OccupantID= @pk_Occupants_OccupantID)
return @OccupantTypeID
END
但SP返回正确的值在SQL级别但在C#级别返回0。为什么?
在执行查询之前,您正在读取参数的值,交换订单。
SqlCom.ExecuteNonQuery();
short OccupantTypeID = Convert.ToInt16(sqlParamOccupantTypeID.Value);
但是你commiting等“陋习”,你的连接确实应该内using
语句包裹和整个程序不重用。 ADO.NET已经实现了Connection Pooling,你不需要自己做,只需要根据需要进行短暂的连接,当你处理它们时,它们将返回到池中。
谢谢,但这种做法从来没有产生任何问题,因为我的软件在企业级运行多年没有任何问题 – Covert
然后,你有幸没有一个程序,不断抛出你的打开和关闭调用之间的异常,造成连接被打开但从不关闭耗尽与Sql Server的所有可用连接。至少我会建议你开始使用'try-finally'块并将'DatabaseConnection.CloseConnection()'放在finally块中。 –
您需要调用'ExecuteNonQuery' _before_您读取值... – petelids
仔细检查您传递的参数并提取数据逻辑。如果DBMS说它返回零,它将返回零。确保使用配置文件工具。 – jean
@jean这不一定是正确的。如果整数的值没有被db调用覆盖,它将返回默认值,对于整数类型,默认值为0,这意味着petelids评论是答案。 –