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

本文关键字:调用 存储过程 异常 引用 获取 | 更新日期: 2023-09-27 18:03:03

我运行生成一个数据表的代码。从这张数据表中,我了解了国家的情况。CRID。我使用这些信息片段来运行代码以获得PRID。问题是,每次运行这个,都会得到空引用异常。我已经尝试在运行代码之前声明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();
        }
    }

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

这一行有问题

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

当然我不能知道你的存储过程的结果,但ExecuteScalar可以返回NULL,如果是这种情况,转换到Int32将失败的错误null reference exception

MSDN说

返回结果集中第一行的第一列,或者返回null如果结果集为空

,则引用(在Visual Basic中没有)。

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

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

如果没有返回值,内存SQLCmd.ExecuteScalar()将返回null,这将给您一个空引用异常。如果返回一个值,但该值是数据库空值,则返回BDNull。

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

一旦我删除了这个,它工作得很好。谢谢大家的贡献。