同じSQLServer上の2つの異なるデータベースにいくつかのトランザクションをラップするのに苦労しています。最初はネットワークDTCアクセスに問題があり、それを解決しました。現在、引き続き発生するエラーは、「基になるトランザクションマネージャーとの通信に失敗しました」です。
データベースにいくつかの顧客プロファイルがあり、これらのプロファイルが古くなった場合は、それらを「アーカイブ」データベースに移動して保存します。移動は、単に(ユーモアのイタリック体)アーカイブデータベースにそれらを追加し、メイン/ライブデータベースからそれらを削除することです。データベースごとにDataContextがあります。以下のコードは、追加を実行し、2番目のDataContextを使用しようとすると、削除でエラーが発生します。LINQを使用してから数か月しか経っていませんが、過去2日間は記事を精査してきました。コードに問題があるかどうか、またはDTCまたは???で正しく構成されていないものがあるかどうかを知りたいのですが。
ワークステーションとサーバーをVMwareで実行しています。-ワークステーションはWindows7SP1-サーバーはWindowsおよびSQLServer2008R2
「移動」のルーチン:
private int MoveProfileToArchiveDB( int iProfileId )
{
int rc = RC.UnknownError;
// get new Archive profile object
ProfileArchive.ProfileInfo piArchive = new ProfileArchive.ProfileInfo();
// 'Live' DataContext
using ( ProfileDataContext dbLive = new ProfileDataContext() )
{
// get Live profile
ProfileInfo piLive = ProfileInfo.GetProfile( dbLive, iProfileId );
// copy Live data to Archive profile object... including the id
ProfileArchive.ProfileInfo.CopyFromLive( piLive, piArchive, true );
}
bool bArchiveProfileExists = ProfileArchive.ProfileInfo.ProfileExists( piArchive.id );
// make the move a transaction...
using ( TransactionScope ts = new TransactionScope() )
{
// Add/Update to Archive db
using ( ProfileArchiveDataContext dbArchive = new ProfileArchiveDataContext() )
{
// if this profile already exists in the Archive db...
if ( bArchiveProfileExists )
{
// update the personal profile in Archive db
rc = ProfileArchive.ProfileInfo.UpdateProfile( dbArchive, piArchive );
}
else
{
// add this personal profile to the archive db
int iArchiveId = 0;
piArchive.ArchiveDate = DateTime.Now;
rc = ProfileArchive.ProfileInfo.AddProfile( dbArchive, piArchive, ref iArchiveId );
}
// if Add/Update was successful...
if ( rc == RC.Success )
{
// Delete from the Live db
using ( ProfileDataContext dbLive = new ProfileDataContext() )
{
// delete the personal profile from the Profile DB
rc = ProfileInfo.DeleteProfileExecCmd( dbLive, iProfileId ); // *** ERROR HERE ***
if ( rc == RC.Success )
{
// Transaction End (completed)
ts.Complete();
}
}
}
}
}
return rc;
}
ノート:
- Deleteにはいくつかの異なるメソッドがあり、それらはすべてTransactionScopeの外部で機能します。
- ProfileInfoはメインのプロファイルテーブルであり、ライブデータベースとアーカイブデータベースの両方でほぼ同じです。
どんな助けでも大歓迎です!どうもありがとう...