Vấn đề là phân tích mã VS2010 trả về hai cảnh báo CA2000 cho một hàm cụ thể. Tôi đã không thành công trong việc tái tạo các cảnh báo bằng một khối mã nhỏ hơn, vì vậy tôi đã đăng toàn bộ chức năng ban đầu.Cảnh báo CA2000 có thể bị xóa bằng cách nhận xét có vẻ như mã không liên quan
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;
}
Hai cảnh báo CA2000 liên quan đến bằng cách sử dụng báo cáo có chứa các SqlConnection
và SqlCommand
.
Tôi không thể tìm thấy bất kỳ vấn đề nào trong mã, nhưng tôi nhận thấy rằng việc nhận xét các dòng một cách ngẫu nhiên sẽ làm cho các lỗi biến mất. Ví dụ: việc nhận xét ba trường tiền được đặt thành 0 trong khối else
sẽ loại bỏ các cảnh báo. Ngược lại, nhận xét chỉ ba dòng với DBNull.Value ở cuối cũng sẽ xóa lỗi. Tôi không thể hiểu được kết quả.
văn bản chính xác của những lời cảnh báo là gì? – demize
Cảnh báo 1: Trong phương thức 'Provider.SaveTransaction (Transaction, UserAccount)', hãy gọi System.IDisposable.Dispose trên đối tượng 'conn' trước khi tất cả các tham chiếu đến nó nằm ngoài phạm vi. –
Cảnh báo 2: Trong phương thức 'Provider.SaveTransaction (Transaction, UserAccount)', hãy gọi System.IDisposable.Dispose trên đối tượng 'cmd' trước khi tất cả các tham chiếu đến nó nằm ngoài phạm vi. –