ExecutesCalarは、1を返す保存されたProcを呼び出すときにnullReferenceExceptionをスローします
-
12-10-2019 - |
質問
この質問を投稿する前にいくつかの調査を行ってきましたが、データが返されない場合、ExecutesCalarがSystem.NullReferenceExceptionをスローするという事実を知っています。そのため、保存されたPROCを「Return 1」に変更したため、返品値が保証されています。ただし、NULL参照例外はまだ取得されています。
そこで、SQLCommandを使用して、データを持つテーブルを照会しようとしました。
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM ATableThatHasValues", conn)
スカラーを実行したとき、値を取得することができたので、データベースを照会する許可があることがわかりました。私はこれが私が見逃した特定の保存されたPROC許可設定であると疑っていますか?
私は今、これにこだわっているので、どんなコメントや提案に感謝します。 :(
私のコードは次のようになります:
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;
}
}
ありがとう!
解決
ランダムな推測
returnを使用しているので、executescalarの列1、行1を読むデータセットはありません
選択または出力パラメーターを使用します
編集:実際、それほどランダムではありません
RETURN 1
結果セットではありません:それは「特別な」パラメーターです
sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue
他のヒント
@gbnが言ったことについて詳しく説明します。 SQLコードを実行すると、3つの異なる方法で情報を返すことができます。 OUTPUT
パラメーター、表形式データ、および/または単一 RETURN
価値。 @gbnが言ったように、 RETURN
値は本質的に専門化されています OUTPUT
パラメーター。 ExecuteScalar
表形式のデータ、つまり最初の行の最初の列からの情報のみが表示されます。電話をかけたときに表形式のデータが受信されない場合 ExecuteScalar
代わりにヌル値が返されます。このヌル値で何かをしようとすると、明らかにNREが得られます。