0

この質問を投稿する前にいくつかの調査を行いましたが、データが返されない場合、ExecuteScalar が System.NullReferenceException をスローするという事実を認識しています。そのため、ストアド プロシージャを「return 1」に変更して、戻り値が保証されるようにしました。ただし、まだ NULL 参照例外が発生しています。

そこで、SqlCommand を使用して、データを持つテーブルをクエリしようとしました。

        SqlCommand sqlCommand = new SqlCommand("SELECT * FROM ATableThatHasValues", conn)

execute scalar を実行すると、値を取得できたので、データベースにクエリを実行する権限があることがわかりました。これは、私が見逃した特定のストアド プロシージャのアクセス許可設定であると思われますか?

私はこれで1日立ち往生しているので、コメント/提案を本当に感謝しています. :(

私のコードは次のようになります。

        using (SqlConnection sqlConnection = new SqlConnection(connectionString))
        {
            sqlConnection.Open();
            using (SqlCommand sqlCommand = new SqlCommand("GetSomeValue", sqlConnection))
            {
                sqlCommand.CommandType = CommandType.StoredProcedure;
                //sqlCommand.Parameters.Add(new SqlParameter("@Id", this.ID));
                //sqlCommand.Parameters.Add(new SqlParameter("@State", 1 /* active */));

                byte retValue = (byte)sqlCommand.ExecuteScalar();
                return retValue;
            }
        }

ありがとう!

4

2 に答える 2

3

@gbnが言ったことについて詳しく説明します。SQL コードを実行すると、OUTPUTパラメーター、表形式のデータ、単一のRETURN値の 3 つの異なる方法で情報を返すことができます。@gbn が言ったように、RETURN値は本質的に特殊なOUTPUTパラメーターです。ExecuteScalar表形式のデータ、つまり最初の行の最初の列からの情報のみが表示されます。呼び出したときに表形式のデータが受信されない場合はExecuteScalar、代わりに null 値が返されます。この null 値を使用して何かを行おうとすると、明らかに NRE が発生します。

于 2011-01-18T19:17:58.333 に答える
2

ランダムな推測

RETURN を使用しているため、ExecuteScalar の列 1、行 1 を読み取るデータセットがありません

SELECT または OUTPUT パラメーターを使用する

編集:実際には、それほどランダムではありません

RETURN 1結果セットではありません: 「特別な」パラメータです

sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue
于 2011-01-18T19:00:30.323 に答える