C# 调用存储过程获取空引用异常

C# 调用存储过程获取空引用异常,c#,asp.net,nullreferenceexception,C#,Asp.net,Nullreferenceexception,我运行生成数据表的代码。从这个数据表中,我看到了州和CRID。我使用这些信息来运行代码以获取PRID。问题是,每次我运行这个,我都会得到一个空引用异常。在运行代码之前,我已经尝试声明int-PRID=0;但是,每次我的答案都是0。我使用相同的参数在SQLServer2008中执行了代码,得到了正确的结果。 我无法确定为什么此代码没有正确运行 public int GetPRID(int RRID, string State, int PCID) { try

我运行生成数据表的代码。从这个数据表中,我看到了州和CRID。我使用这些信息来运行代码以获取PRID。问题是,每次我运行这个,我都会得到一个空引用异常。在运行代码之前,我已经尝试声明int-PRID=0;但是,每次我的答案都是0。我使用相同的参数在SQLServer2008中执行了代码,得到了正确的结果。
我无法确定为什么此代码没有正确运行

    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();
        }
    }

这一行在这里有问题

  int PRID = (Int32)SQLCmd.ExecuteScalar();
当然,我不知道存储过程的结果,但可能会返回NULL,如果是这种情况,对Int32的转换将失败,并出现错误
NULL引用异常

返回结果集中第一行的第一列或null 如果结果集为空,则引用(Visual Basic中无任何内容)

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

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

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

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


一旦我去掉这个,它就工作得很好。谢谢大家的贡献

您在哪一行获得异常?这应该给你(和我们)一个线索。哪一行抛出异常?int PRID=(Int32)SQLCmd.ExecuteScalar();您是否返回您的主键id???请检查一下。或者在存储过程的此行中添加return@@Identity当我从SQL中执行时,结果是2。使用SQL探查器查看代码生成的查询,它可能与您用于测试的查询不同,例如,参数可能不同。对ExecuteScaler的调用显然返回null。谢谢,Ben。您的第一条评论让我回到了SQL代码本身,这有助于我发现问题。