none
SqlDataReader.HasRows を使ってもよい? RRS feed

  • 質問

  • お世話になります。
    Visual Studio 2013 Pro + SQL Server 2012 で 開発しています。
    SqlDataReader.HasRows の使用について、ご教示ください。


    ちょっと古い記事ですが、↓このような書き込みを見つけました。
    ADO.NET経由でSQLがデッドロックになった場合、SQLCommand.ExecuteReaderメソッドがエラにならないことがある件
    http://konitan510itnote.hatenablog.com/entry/20090903/p2

    MSDNの .NET Framework 4.5 にも[解説]メモに「トランザクションがデッドロック状態になると、Readが呼び出されるまで、例外はスローされない可能性があります」と書かれています。
    https://msdn.microsoft.com/ja-jp/library/9kcbe65k(v=vs.110).aspx

    Microsoftサポートにも書かれていて、最終更新日時が2014年2月2日なので、今も継続している話なのだと思っています。
    https://support.microsoft.com/kb/316667/ja?wa=wsignin1.0

    事前にデータが格納されているかどうかを知るために、SqlDataReader.HasRows を使いたいと思うのですが、上記の記事を読んだら、SqlDataReader.HasRows を使わず、すぐに SqlDataReader.Read() を呼び出した方がよいのかという結論に至りました。

    実際、どう実装するのが、よりベターな実装なのでしょうか。

    2015年2月9日 8:50

回答

  • 書かれているご質問の内容から判断するに、特にHasRowsを使用する必要はないように思います。
    以下の例のように、一般的にはReadメソッドの戻り値で判断すれば十分です。

    SqlDataReader.Read メソッド
    https://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqldatareader.read(v=vs.110).aspx


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年2月10日 1:06
    • 回答としてマーク JOSIE39 2015年2月10日 1:36
    2015年2月9日 9:25
    モデレータ
  • SqlDataReader.HasRows プロパティに関わる情報の紹介を有難うございます。

    > 実際、どう実装するのが、よりベターな実装なのでしょうか。

    質問者さんの「結論」の通り、HasRow プロパティを使わないで Read メソッドを使うということで対応できると思いますが、いかがですか?

    以下のページでも書かれていますが、SqlDataReader に Read() 以外のことをするのであれば、HasRow プロパティでチェックするのは good practice かも知れませんが。

    SqlDataReader
    http://stackoverflow.com/questions/14196644/sqldatareader-hasrows

    でも、そもそも、ASP.NET Web アプリであれば(ASP.NET のフォーラムに投稿されていると言うことはそうですよね?)、SqlDataReader を使うことがあまりなさそうな気がします。

    • 回答の候補に設定 星 睦美 2015年2月10日 1:06
    • 回答としてマーク JOSIE39 2015年2月10日 1:36
    2015年2月9日 12:09

すべての返信

  • 書かれているご質問の内容から判断するに、特にHasRowsを使用する必要はないように思います。
    以下の例のように、一般的にはReadメソッドの戻り値で判断すれば十分です。

    SqlDataReader.Read メソッド
    https://msdn.microsoft.com/ja-jp/library/system.data.sqlclient.sqldatareader.read(v=vs.110).aspx


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2015年2月10日 1:06
    • 回答としてマーク JOSIE39 2015年2月10日 1:36
    2015年2月9日 9:25
    モデレータ
  • SqlDataReader.HasRows プロパティに関わる情報の紹介を有難うございます。

    > 実際、どう実装するのが、よりベターな実装なのでしょうか。

    質問者さんの「結論」の通り、HasRow プロパティを使わないで Read メソッドを使うということで対応できると思いますが、いかがですか?

    以下のページでも書かれていますが、SqlDataReader に Read() 以外のことをするのであれば、HasRow プロパティでチェックするのは good practice かも知れませんが。

    SqlDataReader
    http://stackoverflow.com/questions/14196644/sqldatareader-hasrows

    でも、そもそも、ASP.NET Web アプリであれば(ASP.NET のフォーラムに投稿されていると言うことはそうですよね?)、SqlDataReader を使うことがあまりなさそうな気がします。

    • 回答の候補に設定 星 睦美 2015年2月10日 1:06
    • 回答としてマーク JOSIE39 2015年2月10日 1:36
    2015年2月9日 12:09
  • 皆様、返信をありがとうございます。

    HasRowsプロパティを使わず、Readメソッドを直接呼ぶ方向で対応しようと思います。

    > でも、そもそも、ASP.NET Web アプリであれば(ASP.NET のフォーラムに投稿されていると言うことはそうですよね?)、SqlDataReader を使うことがあまりなさそうな気がします。

    はい。ご指摘の通りです。じつは、他チームが書いたコードのレビューをしています。
    今回、新しい取り組み「ASP.NET MVC(EFはハードルが高過ぎるので見送り)」での開発のようです。
    「明らかにパフォーマンスに影響するものや事象によっては障害になりそうなものだけを」という依頼のため、「こう書いた方がベター」とか「今はこう書くはず」という事を提案しています。

    SqlDataReader.Read でグルグルLoopする箇所が多いですが、既にかなり進んでおり、他チームの事でもあり、現時点では改修できません。とりあえず、今できる事を考え、「改善見直し項目」を作成しています。

    皆様、ご回答をありがとうございました。

    2015年2月10日 0:48