2009-04-21 84 views
0

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

代码依赖于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,所以任何帮助表示赞赏。所有有用的答案都会高兴地提出。

回答

1

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

如果你正在处理一个表(例如InvoiceItems),你可以做测试自己(这里采用亚音速的自动生成活动记录执行):

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(); 
} 

希望这可以让你开始。

作为一个完全无关的注脚,don't rely on the DeepSave() method试图跨多个表保存,因为它没有实现。我发现,困难的方式...

+0

你知道是否有办法从存储过程中获得一个Command对象? SubSonic doco非常缺乏。 :( – 2009-04-22 14:13:30