1

我运行生成数据表的代码。从这个数据表中,我收集了 State & 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();
        }
    }
4

3 回答 3

2

这条线在这里有问题

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

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

MSDN 说

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

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

  object result = SQLCmd.ExecuteScalar();
  if(result != null)
      PRID = Convert.ToInt32(result);           
于 2013-03-08T14:00:40.903 回答
1

如果没有返回值, from memorySQLCmd.ExecuteScalar()将返回 null,这会给你一个 null 引用异常。如果返回了一个值,但该值为数据库空值,它将返回 BDNull.value,这也会失败,因为它无法转换为 int32。

于 2013-03-08T14:01:38.090 回答
0

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

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

于 2013-03-08T14:12:17.327 回答