12

メソッドの呼び出しSqlCommand.ExecuteReader()を使用する場合、後でSqlDataReaderオブジェクトを使用すると、NullReference例外が発生する可能性があるとReSharperから通知されます。

したがって、次のコードを使用します。

using (SqlConnection connection = GetConnection())
{
    using (SqlCommand cmd = connection.CreateCommand())
    {
        cmd.CommandText = ; //snip

        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                //snip
            }
        }
    }
}

while (reader.Read())線には下線が引かれています。

私の質問は、リーダーオブジェクトがいつnullになるのかということです。私はそれに出くわしたことがなく、ドキュメントにはそれがあり得るとは記載されていません。nullかどうかを確認する必要がありますか、それとも無視しても安全ですか?

また、ReSharperがnullになる可能性があると考えるのはなぜですか。たとえば、nullのチェックを推奨せずにSqlCommandを使用できる場合はどうでしょうか。ExecuteReaderメソッドに属性があると思います。

4

5 に答える 5

12

誤検知です。

SqlDataReader.ExecuteReaderを振り返ると、リーダーがnullとして返される唯一の方法は、内部RunExecuteReaderメソッドがreturnStreamに対して「false」を渡された場合ですが、そうではありません。

SqlDataReaderの奥深くではリーダーコンストラクターは常にある時点で呼び出されるため、ExecuteReaderがnullを返すことは物理的に不可能であると確信しています。

于 2009-07-02T03:03:59.353 に答える
4

Resharperは正しいです、それは潜在的にnullを返すことができます。

の特定の実装がExecuteReader()null値をバブルアップできないかどうかは関係ありません。つまり、IDataReaderはnullを含む(または指す)ことができるオブジェクトであるという事実が残っています。

  • 将来、別の実装を使用することにした場合はどうなりますIDbCommandか?
  • そのIDbCommnd実装の次の更新に、nullをバブルアップできるようにする、コード内の異なるフローが含まれる場合はどうなりますか?

インターフェースを正しく使用するために、インターフェースの実装内で何が起こっているかを知る必要はありません。インターフェースを知る必要があるだけで、現在、インターフェースは戻り値としてnullを許可しています。

于 2013-12-24T17:21:44.053 に答える
2

私は他のいくつかの分野で彼らとこの問題を抱えていました。彼らはCLRのさまざまな部分のコードパスの分析を行ったようです。nullを返すことが考えられる場合、それは彼らがそれについて不平を言うときです。

私が不満を言った特定のケースでは、nullは実際には起こり得ませんでした。ただし、状況によってはnullを返す可能性のあるメソッドまでコールグラフを追跡し、null値が最上位に伝播する可能性があります。

したがって、これをReSharperバグと呼びます(以前はCLRバグと呼んでいたと思います)。

于 2009-07-02T02:56:38.417 に答える
1

ExecuteReader()がnullを返すことができる理由の1つを特定しました。

nullが発生した場合は、ストアドプロシージャを更新するためのスクリプトをクライアントに送信していました。クライアントのSQLServer(2000)は、DBユーザーがストアドプロシージャを実行するためのアクセス許可を必要とするように設定されています。彼らがSPを更新したとき、許可は削除され、再割り当てされませんでした。この場合、SqlCommand.ExecuteReader()はnullを返しました。

権限を再割り当てすると、これが修正されました。

于 2011-01-18T10:20:29.720 に答える
0

私にとってはnullではありませんでしたが、Powershellで表示すると何も出力されませんでした。これは、クエリが行を返さなかった場合に発生します。

于 2021-01-27T05:27:51.710 に答える