9

エンティティ フレームワークを使用して 2 つのクエリを次々と作成しています。最初のクエリは常に正常に動作しますが、2 番目のクエリは常に私を返します。

メソッドの順序を変更すると、同じことが起こります。最初のメソッドは正常に動作し、2 番目のメソッドはこの例外をスローします。

ページで使用するコードは次のとおりです。

>  var count = RequestBaseBL.GetGenericResultsCount(query.QuerySql);    
> 
>                     var datatable = RequestBaseBL.GetGenericResults(query.QuerySql, 0);

そして私のDALで

public int  GetGenericResultsCount(string strsql)
            {
                using (var connection = (SqlConnection)_context.Database.Connection)
                {
                    var adapter = new SqlDataAdapter(strsql, connection);
                    var results = new DataSet();
                    adapter.Fill(results, "Results");
                    return results.Tables["Results"].Rows.Count;
                }
            }


        public DataTable GetGenericResults(string strsql, int pageIndex)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("WITH MyPagedData as ( ");
                int indexFrom = strsql.IndexOf("from");
                sb.Append(strsql.Substring(0, indexFrom));
                sb.Append(", ");
                sb.Append("ROW_NUMBER() OVER(ORDER BY RequestBaseId DESC) as RowNum ");
                sb.Append(strsql.Substring(indexFrom));
                sb.Append(") ");
                sb.Append("SELECT * from MyPagedData where RowNum between @StartIndex and @StartIndex + 10");


                using(var connection = (SqlConnection)_context.Database.Connection)
                {
                    var adapter = new SqlDataAdapter(sb.ToString(), connection);
                    adapter.SelectCommand.Parameters.Add("@StartIndex", SqlDbType.Int).Value = pageIndex;
                    var results = new DataSet();
                    adapter.Fill(results, "Results");
                    return results.Tables["Results"];
                }
            }
4

1 に答える 1

21

一般に、演算子を使用するか、ファクトリメソッドusingを使用して、変数に割り当てられたオブジェクトを作成するときに、構成を使用する必要があります。innewConnectionプロパティは、接続がまだ存在しない場合にのみ接続を作成します。他のすべての場合、プロパティは単に既存のものを返します。DatabaseDbContext

Disposeあなたのコードでは、最初の呼び出しは「ライブ」接続を取得し、それを操作してから、によって暗黙的に実行されるの呼び出しを介してそれを閉じますusing。この時点で、DatabaseofDbContextには解放されたオブジェクトへの参照があります。2番目の呼び出しは、解放されたオブジェクトを取得して使用しようとし、エラーをトリガーします。

これを修正するには、単にusing割り当てに置き換えます。

var connection = (SqlConnection)_context.Database.Connection;
于 2012-06-06T09:49:38.743 に答える