0

我有一些遗留代码,我正在使用 SubSonic 重写以帮助未来的维护者。在大多数情况下,它相对简单,因为一切都进行了存储过程调用。但是现在我在使用一些紧密耦合的 ADO.NET 代码时遇到了一些困难。

该代码取决于 SqlDataAdapter 来决定何时调用 INSERT 或 UPDATE 存储过程,我理解。如何以 SubSonic 的方式重写此代码?

public void SaveInvoice(InvoiceItems invoiceItems)
{
    // extraneous code removed
    // invoiceItems is a dataset

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "InvoiceItem_INSERT";
    cmd.Connection = conn;

    updateCmd.CommandType = CommandType.StoredProcedure;
    updateCmd.CommandText = "InvoiceItem_UPDATE";
    updateCmd.Connection = conn;

    SqlCommandBuilder.DeriveParameters(cmd);
    SqlCommandBuilder.DeriveParameters(updateCmd);

    adapter.InsertCommand = cmd;
    adapter.UpdateCommand = updateCmd;

    adapter.Update(invoiceItems._InvoiceItemTable);
}

我是 SubSonic 的新手,因此不胜感激。所有有用的答案都将得到热烈的支持。

4

1 回答 1

1

使用 SubSonic 不会有这种代码的精确表示,因为自动插入/更新是由该SqlDataAdapter.Update()方法专门完成的。如果不知何故,埋在 SubSonic 命名空间的某个地方,我也想知道如何使用它!

如果您正在处理一张表(例如InvoiceItems),您可以自己进行测试(这使用 SubSonic 的自动生成的活动记录实现):

int key = InvoiceItems.ID; // not sure what your primary key identifier is called
InvoiceItem item = new InvoiceItem(key);
if (item != null)
{
    SPs.InvoiceItem_UPDATE(param1, param2, etc).Execute();
}
else 
{
    SPs.InvoiceItem_INSERT(param1, param2, etc).Execute();
}

希望这能让你开始。

作为一个完全不相关的旁注,不要依赖该DeepSave()方法来尝试跨多个表保存,因为它没有实现。我发现这很难...

于 2009-04-21T21:59:08.697 回答