获取null引用异常调用存储过程

时间:2013-03-08 13:56:21

标签: c# asp.net nullreferenceexception

我运行生成数据表的代码。从这个数据表中,我收集了State& CRID。我使用这些信息来运行代码来获取PRID。问题是,每次运行时,我都会得到一个Null Reference Exception。我在运行代码之前尝试声明了int PRID = 0;然而,每次我最后得到0作为我的答案。我使用相同的参数在SQLServer 2008中执行了代码,并得到了正确的结果 我无法确定此代码无法正常运行的原因。

    public int GetPRID(int RRID, string State, int PCID)
    {
        try
        {

            SQLCON = new SqlConnection(connectionString);
            SQLCON.Open();
            SQLCmd = new SqlCommand("spGetPRID", SQLCON);
            SQLCmd.CommandType = CommandType.StoredProcedure;
            SQLCmd.Parameters.Add("@RRID", SqlDbType.Int).Value = RRID;
            SQLCmd.Parameters.Add("@State", SqlDbType.VarChar).Value = State;
            SQLCmd.Parameters.Add("@PCID", SqlDbType.Int).Value = PCID;

            int PRID = (Int32)SQLCmd.ExecuteScalar();
            return PRID;
        }
        catch(Exception ex)
        {
            HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx?" + ex.Message, false);
            return 0;
        }
        finally
        {
            SQLCON.Close();
        }
    }

3 个答案:

答案 0 :(得分:2)

此行存在问题

  int PRID = (Int32)SQLCmd.ExecuteScalar();

当然我无法知道存储过程的结果,但是ExecuteScalar可能会返回NULL,如果是这种情况,则转换为Int32将失败并显示错误null reference exception

MSDN says

  

返回结果集中第一行的第一列,或返回null   如果结果集为空,则为引用(在Visual Basic中为Nothing)

因此,如果有可能获得null作为返回值,那么正确的方法是

  object result = SQLCmd.ExecuteScalar();
  if(result != null)
      PRID = Convert.ToInt32(result);           

答案 1 :(得分:1)

如果没有返回值,则从内存SQLCmd.ExecuteScalar()将返回null,这将为您提供空引用异常。如果返回一个值,但该值为数据库null,则返回BDNull.value,这也将失败,因为它无法转换为int32。

答案 2 :(得分:0)

我发现了这个问题。它不在我的C#代码中 - 它在SQL本身内。我将@PRID声明为int,并要求它返回@PRID。

一旦我删除它,它工作正常。谢谢大家的贡献。