5

上記のエラーは、データベースから受信したデータに対して dataReader.Read を実行しようとすると発生します。そこには2つの行があることがわかっているので、実際にはデータが存在しないため、そうではありません。

CommandBehavior.CloseConnection が問題の原因ではないでしょうか? ExecuteReader の直後にこれを行う必要があると言われましたか? これは正しいです?

        try
        {
            _connection.Open();
            using (_connection)
            {
                SqlCommand command = new SqlCommand("SELECT * FROM Structure", _connection);
                SqlDataReader dataReader = command.ExecuteReader(CommandBehavior.CloseConnection);

                if (dataReader == null) return null;

                var newData = new List<Structure>();
                while (dataReader.Read())
                {
                    var entity = new Structure
                    {
                        Id = (int)dataReader["StructureID"],
                        Path = (string)dataReader["Path"],
                        PathLevel = (string)dataReader["PathLevel"],
                        Description = (string)dataReader["Description"]
                    };

                    newData.Add(entity);
                }
                dataReader.Close();

                return newData;
            }
        }
        catch (SqlException ex)
        {
            AddError(new ErrorModel("An SqlException error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex));
            return null;
        }
        catch (Exception ex)
        {
            AddError(new ErrorModel("An error has occured whilst trying to return descendants", ErrorHelper.ErrorTypes.Critical, ex));
            return null;
        }
        finally
        {
            _connection.Close();
        }
    }

助けてくれてありがとう。

クレア

4

5 に答える 5

2

表示されているコードは問題ありません。私はそれをテストプロジェクトに取り入れましたが、動作します。上記のコードでこのメッセージが表示される理由はすぐにはわかりません。ここにいくつかのデバッグのヒント/提案があります。それらがあなたにとって価値があることを願っています。

  • にブレークポイントを作成しますwhile (dataReader.Read())。コードブロックに入る前に、これをイミディエイト ウィンドウまたはウォッチ ウィンドウに入力しますdataReader.HasRows。それはtrueと評価されるはずです。

  • その上で停止している間にRead()、[ローカル] ウィンドウを開いて のすべてのプロパティを調べますdataReader。FieldCount がSELECTステートメントから期待されるものであることを確認してください。

  • このイテレーションに足を踏み入れるRead()と、学生オブジェクトが作成されますか? dataReader["StructureID"]イミディエイト ウィンドウのその他すべての値は何ですか?

それCommandBehavior.CloseConnectionは問題の原因ではありません。これは、データリーダーを閉じるときに接続自体も閉じるように指示するだけです。

于 2010-08-12T15:41:10.357 に答える
0

そのエラーが発生したとき、それはたまたまコマンドのタイムアウトの問題でした (私はいくつかの大きなバイナリ データを読み取っていました)。最初の試みとして、コマンドのタイムアウト (接続のタイムアウトではありません!) を増やしたところ、問題は解決しました。注: 問題を見つけようとして、(Sql) 接続の StateChanged イベントをリッスンしようとしましたが、接続が「壊れた」状態になることは決してないことがわかりました。

于 2014-06-12T09:35:29.780 に答える
0

VS.NET デバッガーを使用して IQueryable の結果を調べようとしたときに、この例外が発生しました。IQueryable によって大きなテーブル スキャンが発生したため、不適切な判断でした。デバッガーを停止して再起動し、この特定の IQueryable をプレビューしようとしないことが回避策でした。

于 2020-02-14T18:00:18.733 に答える