1

データテーブルを生成するコードを実行します。このデータテーブルから、州と CRID をグリーニングします。これらの情報を使用してコードを実行し、PRID を取得します。問題は、これを実行するたびに Null 参照例外が発生することです。コードを実行する前に 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によると

結果セットの最初の行の最初の列を返します。結果セットが空の場合はnull参照(Visual BasicではNothing)を返します。

したがって、戻り値としてnullを取得する可能性がある場合の正しいアプローチは、

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

SQLCmd.ExecuteScalar()値が返されない場合、From memoryは null を返します。これにより、null 参照例外が発生します。値が返されたが、その値がデータベースの null である場合、BDNull.value が返されます。これも int32 にキャストできないため失敗します。

于 2013-03-08T14:01:38.090 に答える
0

問題が見つかりました。それは私の C# コードではなく、SQL 自体の中にありました。@PRID を int として宣言し、@PRID を返すように要求していました。

これを削除したら、うまくいきました。皆様の貢献に感謝いたします。

于 2013-03-08T14:12:17.327 に答える