2012-06-15 26 views
5

問題是VS2010代碼分析針對特定功能返回兩個CA2000警告。我還沒有成功用較小的代碼塊複製警告,所以我已經完整地發佈了原始函數。CA2000警告可以通過註釋掉似乎無關的代碼

public int SaveTransaction(Transaction tx, UserAccount account) { 

     if (tx == null) { 
      throw new ArgumentNullException("tx"); 
     } 

     if (account == null) { 
      throw new ArgumentNullException("account"); 
     } 

     bool isRefund = tx.TransactionType == LevelUpTransaction.TransactionTypes.Refund; 

     int pnRef = 0; 

     using (SqlConnection conn = new SqlConnection(DatabaseConfiguration.ConnectionString)) { 

      using (SqlCommand cmd = new SqlCommand("dbo.SaveTransaction", conn)) { 

       cmd.CommandType = CommandType.StoredProcedure; 

       cmd.Parameters.Add("@InvoiceId", SqlDbType.VarChar, 100).Value = tx.InvoiceNumber; 
       cmd.Parameters.Add("@TxStartDate", SqlDbType.DateTime).Value = tx.TransactionBeginDate; 
       cmd.Parameters.Add("@AuthDate", SqlDbType.DateTime).Value = tx.AuthenticationDate; 
       cmd.Parameters.Add("@MerchantKey", SqlDbType.Int).Value = account.MerchantKey; 
       cmd.Parameters.Add("@UserName", SqlDbType.Char, 25).Value = account.UserName; 
       cmd.Parameters.Add("@RegisterNumber", SqlDbType.Char, 10).Value = tx.RegisterNumber; 
       cmd.Parameters.Add("@ResellerKey", SqlDbType.Int).Value = account.ResellerKey; 
       cmd.Parameters.Add("@TxEndDate", SqlDbType.DateTime).Value = tx.TransactionEndDate; 
       cmd.Parameters.Add("@IpAddress", SqlDbType.VarChar, 15).Value = account.IPAddress; 
       cmd.Parameters.Add("@CustomerId", SqlDbType.VarChar, 50).Value = tx.CustomerId; 
       cmd.Parameters.Add("@TransactionId", SqlDbType.VarChar, 50).Value = tx.TransactionId; 
       cmd.Parameters.Add("@ProcStartDate", SqlDbType.DateTime).Value = tx.ProcessorBeginDate; 
       cmd.Parameters.Add("@ProcEndDate", SqlDbType.DateTime).Value = tx.ProcessorEndDate; 
       cmd.Parameters.Add("@AuthAmount", SqlDbType.Money).Value = StringParser.ParseDecimal(tx.OriginalAmount); 
       cmd.Parameters.Add("@ResultCode", SqlDbType.VarChar, 50).Value = tx.ResultCode; 
       cmd.Parameters.Add("@ResultMessage", SqlDbType.VarChar, 150).Value = tx.ResultMessage; 
       cmd.Parameters.Add("@PONumber", SqlDbType.VarChar, 100).Value = tx.PurchaseOrderNumber; 
       cmd.Parameters.Add("@TaxAmount", SqlDbType.Money).Value = StringParser.ParseDecimal(tx.TaxAmount); 
       cmd.Parameters.Add("@Refund", SqlDbType.Bit).Value = isRefund; 

       if (tx.Order != null) { 
        cmd.Parameters.Add("@HostDate", SqlDbType.VarChar, 50).Value = tx.Order.HostTime.ToString(); 
        cmd.Parameters.Add("@ApprovalCode", SqlDbType.VarChar, 50).Value = tx.Order.TransactionId.ToString(CultureInfo.InvariantCulture); 
        cmd.Parameters.Add("@NameOnCard", SqlDbType.VarChar, 200).Value = tx.Order.UserFirstName + " " + tx.Order.UserLastNameInitial; 
        cmd.Parameters.Add("@TipAmount", SqlDbType.Money).Value = StringParser.ParseDecimal(tx.Order.Tip.FormattedAmount); 
        cmd.Parameters.Add("@TotalAmount", SqlDbType.Money).Value = StringParser.ParseDecimal(tx.Order.TotalAmount.FormattedAmount); 
        cmd.Parameters.Add("@DiscountAmount", SqlDbType.Money).Value = StringParser.ParseDecimal(tx.Order.CreditAmount.FormattedAmount); 
       } 

       else { 
        cmd.Parameters.Add("@NameOnCard", SqlDbType.VarChar, 200).Value = DBNull.Value; 
        cmd.Parameters.Add("@HostDate", SqlDbType.VarChar, 50).Value = DBNull.Value; 
        cmd.Parameters.Add("@ApprovalCode", SqlDbType.VarChar, 50).Value = DBNull.Value; 
        cmd.Parameters.Add("@TipAmount", SqlDbType.Money).Value = 0; 
        cmd.Parameters.Add("@TotalAmount", SqlDbType.Money).Value = 0; 
        cmd.Parameters.Add("@DiscountAmount", SqlDbType.Money).Value = 0; 
       } 

       if (isRefund) { 
        cmd.Parameters.Add("@OriginalPnRef", SqlDbType.Int).Value = tx.OriginalToken; 
       } 

       conn.Open(); 

       using (SqlDataReader dr = cmd.ExecuteReader()) { 

        while (dr.Read()) { 
         pnRef = SqlNull.Integer(dr["TRX_HD_Key"]); 
        } 
       } 
      } 

     } 

     return pnRef; 
    } 

兩個CA2000警告涉及含有SqlConnectionSqlCommand using語句。

我在代碼本身找不到任何問題,但我發現隨機發表評論會使錯誤消失。例如,註釋else區塊中的三個貨幣字段設置爲0將刪除警告。相反,在最後用DBNull.Value註釋掉三行也會刪除錯誤。我無法理解結果。

+1

有什麼警告的確切的文本? – demize

+0

警告1:在方法'Provider.SaveTransaction(Transaction,UserAccount)'中,在對象'conn'上調用System.IDisposable.Dispose之前,所有對它的引用超出範圍。 –

+0

警告2:在方法'Provider.SaveTransaction(Transaction,UserAccount)'中,在對象'cmd'上調用System.IDisposable.Dispose之前,所有對它的引用超出範圍。 –

回答

4

這已報告在Microsoft Connect作爲分析儀中可能的錯誤。顯然,如果一個using聲明包含很多代碼,則會錯誤地報告此消息。

它可以與抑制:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")]