2012-06-15 10 views
5

पर टिप्पणी करके हटाया जा सकता है यह मुद्दा यह है कि वीएस -2010 कोड विश्लेषण किसी विशेष कार्य के लिए दो सीए 2000 चेतावनियां लौटा रहा है। मैं कोड के छोटे ब्लॉक के साथ चेतावनियों को पुन: उत्पन्न करने में सफल नहीं रहा हूं, इसलिए मैंने मूल कार्य को पूरी तरह से पोस्ट किया है।सीए 2000 चेतावनी जो कि असंबद्ध संहिता

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 चेतावनी का उपयोग कर बयान SqlConnection और SqlCommand युक्त करने के लिए संबंधित हैं।

मुझे कोड में कोई समस्या नहीं मिल रही है, लेकिन मुझे पता चला है कि यादृच्छिक रूप से लाइनों पर टिप्पणी करने से त्रुटियां दूर हो जाएंगी। उदाहरण के लिए, else ब्लॉक में 0 पर सेट किए जा रहे तीन धन फ़ील्ड पर टिप्पणी करने से चेतावनियां हटा दी जाएंगी। इसके विपरीत, डीबीएनयूएल के साथ केवल तीन लाइनों पर टिप्पणी कर रहे हैं। अंत में वैल्यू भी त्रुटि को हटा देगा। मैं परिणामों का एहसास नहीं कर सकता।

+1

चेतावनियों का सटीक पाठ क्या है? – demize

+0

चेतावनी 1: विधि 'प्रदाता। सेवट्रांसक्शन (लेनदेन, उपयोगकर्ता खाता)' में, सिस्टम को कॉल करें। आईडीस्पोज़ेबल। ऑब्जेक्ट 'कॉन्स' पर निर्भर करें इससे पहले कि सभी संदर्भ इस दायरे से बाहर हैं। –

+0

चेतावनी 2: विधि 'प्रदाता। सेवट्रांसक्शन (लेनदेन, उपयोगकर्ता खाता)' में, सिस्टम को कॉल करें। आईडीस्पोज़ेबल। ऑब्जेक्ट 'cmd' पर निर्भर करें इससे पहले कि सभी संदर्भ इस दायरे से बाहर हैं। –

उत्तर

4

यह Microsoft Connect पर विश्लेषक में संभावित बग के रूप में रिपोर्ट किया गया है। जाहिर है, अगर using कथन में बहुत सारे कोड हैं, तो इस संदेश की गलती से रिपोर्ट किया गया है।

यह साथ दबा दिया जा सकता है:

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope")] 
संबंधित मुद्दे