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 名前空間のどこかに埋もれている場合は、その使用方法も知りたいです!

1 つのテーブル (例: ) を扱っている場合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();
}

うまくいけば、これで始められます。

As a totally unrelated sidenote, don't rely on the DeepSave() method to try to save across multiple tables, because it is not implemented. I found that out the hard way...

于 2009-04-21T21:59:08.697 に答える