2015-10-06 59 views
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。为什么?

+10

您需要调用'ExecuteNonQuery' _before_您读取值... – petelids

+0

仔细检查您传递的参数并提取数据逻辑。如果DBMS说它返回零,它将返回零。确保使用配置文件工具。 – jean

+0

@jean这不一定是正确的。如果整数的值没有被db调用覆盖,它将返回默认值,对于整数类型,默认值为0,这意味着petelids评论是答案。 –

回答

2

在执行查询之前,您正在读取参数的值,交换订单。

SqlCom.ExecuteNonQuery(); 
short OccupantTypeID = Convert.ToInt16(sqlParamOccupantTypeID.Value); 

但是你commiting等“陋习”,你的连接确实应该内using语句包裹和整个程序不重用。 ADO.NET已经实现了Connection Pooling,你不需要自己做,只需要根据需要进行短暂的连接,当你处理它们时,它们将返回到池中。

+0

谢谢,但这种做法从来没有产生任何问题,因为我的软件在企业级运行多年没有任何问题 – Covert

+2

然后,你有幸没有一个程序,不断抛出你的打开和关闭调用之间的异常,造成连接被打开但从不关闭耗尽与Sql Server的所有可用连接。至少我会建议你开始使用'try-finally'块并将'DatabaseConnection.CloseConnection()'放在finally块中。 –