ライブ環境で動作および使用されている現在のプログラムを更新しています。これにより、顧客と注文が保存され、古いデータベースにもエクスポートされます。新しいシステムのレポートシステムが開発中である間、すべてのレポートは引き続き古いシステムで実行されます。そのため、これらすべてをエクスポートする必要があります。
このプログラムには、1つのトランザクション内でC#からSQLへの複数の呼び出しをグループ化するために使用される組み込みのC#TransactionManagerがあります。これを複製しようとすると、エラーが発生し、機能しなくなります。
動作しているコードは次のとおりです。
using (ITransactionInfo trx = this.TransactionManager.BeginTransaction())
{
//
// Update the customer. If the customer doesn't exist, then create a new one.
//
this.SaveCustomer(Order);
//
// Save the Order.
//
this.Store.SaveCorporateOrder(Order, ServiceContext.UserId);
//
// Save the Order notes and the customer notes.
//
this.NotesService.AppendNotes(NoteObjectTypes.CorporateOrder, Order.Id, Order.OrderNotes);
this.NotesService.AppendNotes(NoteObjectTypes.Customer, Order.Customer.Id, Order.CustomerNotes);
//
// Export the Order if it's new.
//
this.ExportOrder(Order, lastSavedVersion);
//
// Commit the transaction.
//
trx.Commit();
}
これらの関数はすべて、データをフォーマットし、DBで選択/挿入/更新操作を実行するDB内のストアドプロシージャにパラメータを送信するだけです。
SaveCustomerストアドプロシージャは、顧客を新しいデータベースに保存します。
SaveCorporateOrderストアドプロシージャは、Save Customerストアドプロシージャによって書き込まれた情報を取得し、それを使用して注文を新しいデータベースに保存します。
ExportOrderストアドプロシージャは、前の両方によって書き込まれた情報を取得し、Orderを古いデータベースにエクスポートします。
これらの各ストアドプロシージャには、@@ TRANCOUNT == 0の場合に新しいトランザクションを開始し、最後にcommitステートメントがあるコードが含まれています。C#でのトランザクションのため、これらはいずれも使用されていないようですが、トランザクション情報または接続情報を、表示されているストアドプロシージャに渡すコードはありません。これは、SQL 2005サーバーで機能し、使用されています。
これをビルドしてSQL2008R2を使用する開発環境で使用しようとすると、次のようなエラーが発生します。
"Uncommittable transaction is detected at the end of the batch"
と
"The server failed to resume the transaction"
それぞれが独自のトランザクションを開始しており、同じトランザクション内にあることを確認する代わりに、前のコミットされていないトランザクションからデータを読み取ることができないようです。SQLバージョンが異なると、これが異なる動作をする可能性があるかどうかはわかりませんが、まったく同じコードがLiveインストールで動作しますが、Dev環境では動作しません。
どんなアイデアでも、次にどこを見るべきかさえ素晴らしいでしょう!
ありがとう!-ジェイコブ