Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么输出参数在c#级别返回0?_C#_Sql_Asp.net_Sql Server - Fatal编程技术网

为什么输出参数在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());

我试图从存储过程中获取输出,但在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:


但是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);