2011-07-14 4 views
2

私は、私たちのプロジェクトの1つでコード分析を実行しましたが、次の警告メッセージが表示されたら少し驚きました。DataContextとコード分析メッセージを廃棄する

CA2000:Microsoft.Reliability: 'DataImport.ImportSalesExecBackFill(Stream)'メソッドでは、すべての参照が有効範囲外になる前に、System.IDisposable.Disposeオブジェクト 'dc'を呼び出します。

コードの次の部分を参照してください。

  using (DataDataContext dc = new DataDataContext(ConfigurationManager.ConnectionStrings["data"].ConnectionString)) 
      { 
       List<tableSale> sample = (from s in dc.tableSales 
                where bfData.Select(d => d.RegNo).ToList().Contains(s.RegNum) 
                select s).ToList(); 

       var matches = (from s in sample 
           join bfd in bfData on s.RegNum equals bfd.RegNo 
           where string.IsNullOrEmpty(s.OpDesc) 
           select new { UserId = s.UserID, OpId = String.Format("SMMT{0}-{1}", s.DlrNo, bfd.OpName), OpDesc = bfd.OpName }).ToList(); 

       List<tableSale> updQuery = (from s in dc.tableSales 
                where matches.Select(d => d.UserId).ToList().Contains(s.UserID) 
                select s).ToList(); 

       foreach (tableSale rec in updQuery) 
       { 
        rec.OpID = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpId).First(); 
        rec.OpDesc = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpDesc).First(); 
       } 

       dc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict); 

       using (PCSalesDataContext pcdc = new PCSalesDataContext(ConfigurationManager.ConnectionStrings["LatData"].ConnectionString)) 
       { 
        List<tblSale> upd700 = (from s in pcdc.tblSales 
              where matches.Select(d => d.UserId).ToList().Contains(s.UserID) 
              select s).ToList(); 

        foreach (tblSale rec in upd700) 
        { 
         rec.OpID = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpId).First(); 
         rec.OpDesc = matches.Where(s => s.UserId == rec.UserID).Select(s => s.OpDesc).First(); 
        } 

        pcdc.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict); 
       } 

       result = true; 
      } 

私はdatacontextが常にusingステートメントのスコープの終わりに配置されるという印象を受けました。私は何かを逃していますか、これは私が喜んで無視することができる警告メッセージですか?

+0

恐らくバグだと思うが、私はあなたの使い方については間違いないと思う。 – leppie

答えて

3

おそらくusingステートメント内に関数呼び出しが多すぎる(63を超える)場合があります。

http://connect.microsoft.com/VisualStudio/feedback/details/557088/vb-net-using-block-ca2000-warning-if-too-many-calls

https://connect.microsoft.com/VisualStudio/feedback/details/607263/warning-ca2000-although-object-is-disposed

だから、はい、それはコード解析のバグだ参照してください、あなたがメッセージを無視することができますが、とにかく自分のコードをリファクタリングすることもできます。

+0

ありがとう、私の問題は非常によく似ているようだが、私は実行時に私のオブジェクトコレクションをループしますが、コンパイル時(コード分析が実行されているとき)はその番号の近くにはありません。たぶん別の関連するバグを発見したかもしれません。 – saj

+0

さて、私はそれらを数えませんでしたが、あなたのコードにはたくさんの呼び出しがあるようです。 – Henrik