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警告涉及含有SqlConnection
和SqlCommand
using語句。
我在代碼本身找不到任何問題,但我發現隨機發表評論會使錯誤消失。例如,註釋else
區塊中的三個貨幣字段設置爲0將刪除警告。相反,在最後用DBNull.Value註釋掉三行也會刪除錯誤。我無法理解結果。
有什麼警告的確切的文本? – demize
警告1:在方法'Provider.SaveTransaction(Transaction,UserAccount)'中,在對象'conn'上調用System.IDisposable.Dispose之前,所有對它的引用超出範圍。 –
警告2:在方法'Provider.SaveTransaction(Transaction,UserAccount)'中,在對象'cmd'上調用System.IDisposable.Dispose之前,所有對它的引用超出範圍。 –