最初我在我的DL中有一个方法可以接收它正在更新的对象:
internal void UpdateCash(Cash Cash)
{
using (OurCustomDbConnection conn = CreateConnection("UpdateCash"))
{
conn.CommandText = @"update Cash
set captureID = @captureID,
ac_code = @acCode,
captureDate = @captureDate,
errmsg = @errorMessage,
isDebit = @isDebit,
SourceInfoID = @sourceInfoID,
PayPalTransactionInfoID = @payPalTransactionInfoID,
CreditCardTransactionInfoID = @CreditCardTransactionInfoID
where id = @cashID";
conn.AddParam("@captureID", cash.CaptureID);
conn.AddParam("@acCode", cash.ActionCode);
conn.AddParam("@captureDate", cash.CaptureDate);
conn.AddParam("@errorMessage", cash.ErrorMessage);
conn.AddParam("@isDebit", cyberCash.IsDebit);
conn.AddParam("@PayPalTransactionInfoID", cash.PayPalTransactionInfoID);
conn.AddParam("@CreditCardTransactionInfoID", cash.CreditCardTransactionInfoID);
conn.AddParam("@sourceInfoID", cash.SourceInfoID);
conn.AddParam("@cashID", cash.Id);
conn.ExecuteNonQuery();
}
}
我的老板觉得每次更新一两个字段创建一个对象都是过度的。但是我在代码中有几个地方使用它。他建议只使用UpdateCash并发送我想要更新的CAsh和字段的ID。好吧问题是我使用原始方法在代码中有2个位置。这两个地方正在更新现金表中2个完全不同的字段。在我能够获得现有现金记录并将其推入Cash对象之前,然后更新我想要在DB中更新的属性,然后将现金对象发回上面的方法。
我需要一些关于如何做的建议。我有2种方法,它们具有相同的签名。我不太确定要重命名这些内容,因为两者都在更新现金表中的2个完全不同的字段:
internal void UpdateCash(int cashID, int paypalCaptureID)
{
using (OurCustomDbConnection conn = CreateConnection("UpdateCash"))
{
conn.CommandText = @"update Cash
set CaptureID = @paypalCaptureID
where id = @cashID";
conn.AddParam("@captureID", paypalCaptureID);
conn.ExecuteNonQuery();
}
}
internal void UpdateCash(int cashID, int PayPalTransactionInfoID)
{
using (OurCustomDbConnection conn = CreateConnection("UpdateCash"))
{
conn.CommandText = @"update Cash
set PaymentSourceID = @PayPalTransactionInfoID
where id = @cashID";
conn.AddParam("@PayPalTransactionInfoID", PayPalTransactionInfoID);
conn.ExecuteNonQuery();
}
}
所以我想嗯,也许更改这些名称,以便它们现在是独特的,并在某种程度上解释了它的更新字段:
UpdateCashOrderID
UpdateCashTransactionInfoID
好吧,但这不是很好的名字。而且我不能过于笼统,例如:
UpdateCashTransaction(int cashID, paypalTransactionID)
如果除了paypalTransactionInfoID之外,现金记录还拥有不同类型的transactionID,该怎么办?例如creditCardInfoID?那又怎样?交易不告诉我是什么样的。此外,如果您要更新2个字段,那么在cashID参数旁边有2个参数:
UpdateCashTransaction(int cashID, paypalTransactionID, someOtherFieldIWantToUpdate)
看到我的沮丧?处理这个的最好方法是我的老板不喜欢我的第一条路线?
答案 0 :(得分:3)
为什么不呢:
UpdateCashPaymentSource(int cashID, int PayPalTransactionInfoID)
UpdateCashCapture(int cashID, int paypalCaptureID)
答案 1 :(得分:2)
我的老板觉得每次更新一两个字段创建一个对象都是过度的。
他是对的,如果你必须每次都创建对象。对此的正确回答是您应该已经在整个应用程序中使用这些业务对象。您不创建新的Cash对象。你传递了你必须保存的Cash对象。
答案 2 :(得分:1)
“UpdateCashWithCapture”和“UpdateCashWithTransaction”?
答案 3 :(得分:1)
UpdateCashByTransactionInfoID
UpdateCashByCaptureID()
答案 4 :(得分:1)
一种方法和枚举会削减它吗?
internal void UpdateCash(int cashID, int id, FieldName field)
{
using (OurCustomDbConnection conn = CreateConnection("UpdateCash"))
{
conn.CommandText = string.format("update Cash set {0} = @id where id = @cashID", field.ToString());
conn.AddParam("@id", id);
conn.AddParam("@cashId", cashId);
conn.ExecuteNonQuery();
}
}
public enum FieldName
{
PayPalCaptureId,
PayPalTransactionInfoID
}
修改强>
现在阅读你的编辑,我同意你的原始方法将是我的观点 - 传递一个对象并更新数据库中的所有相关字段与传入一个对象属性值相比更新数据库中的最大性能杀手将是打开数据库连接,而不是与一个数据库记录相关的字段数。
答案 5 :(得分:0)
UpdateCashByCaptureID
和UpdateCashByTransactionInfoID
怎么样?
答案 6 :(得分:0)
添加要更新的字段的名称,即
internal void UpdateCash_paypalCaptureID(...)
internal void UpdateCash_PayPalTransactionInfoID(...)
答案 7 :(得分:0)
您可以将更新查询逻辑封装在类中:
public abstract class CashUpdateQuery
{
public CashUpdateQuery(int cashId)
{
this.CashId = cashId;
}
protected int CashId { get; private set; }
public abstract void SetConnectionProperties(OurCustomDbConnection conn);
}
然后,您可以为每个更新方案设置特定的子类。因此,对于您的PayPal查询,您将拥有以下内容:
public PaypalTransactionCashUpdateQuery : CashUpdateQuery
{
private readonly int paypalCaptureId;
public PaypalTransationCashUpdateQuery(int cashId, int paypalCaptureId)
{
this.paypalCaptureId = paypalCaptureId;
}
public override void SetConnectionProperties(OurCustomDbConnection conn)
{
conn.CommandText = @"update Cash
set CaptureID = @paypalCaptureID
where id = @cashID";
conn.AddParam("@captureID", this.paypalCaptureId);
conn.AddParam("@cashID", this.CashId);
}
}
然后你的update方法可以获取一个查询对象并使用它来设置连接上的查询属性并执行它:
internal void UpdateCash(CashUpdateQuery query)
{
using(OurCustomDbConnection conn = CreateConnection("UpdateCash"))
{
query.SetConnectionProperties(conn);
conn.ExecuteNonQuery();
}
}
这意味着添加新查询只是添加CashUpdateQuery的新子类的一种情况。