- PR -

リンクサーバを利用したSQLのトランザクション処理について

1
投稿者投稿内容
mm
会議室デビュー日: 2004/11/02
投稿数: 13
投稿日時: 2004-11-11 15:52
お世話になっております。

windowsXP,c#,SQLserver2000を使用して開発しています。

リンクサーバ上のテーブルのデータを元に、ローカルのDB上のテーブル
を更新する処理を行っているのですが、
次のようなエラーが発生してしまいます。
------------------------------------------------------------------------------------
System.Data.SqlClient.SqlException: OLE DB プロバイダ 'SQLOLEDB' は分散トランザ
クションを開始できなかったので、要求した操作は実行されませんでした。
[OLE/DB provider returned message: 指定されたトランザクション コーディネータに、
新規トランザクションを参加できませんでした。]
OLE DB エラー トレース [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransac
tion returned 0x8004d00a]。
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
------------------------------------------------------------------------------------
同じDB上のテーブル同士だと同じ処理が問題なくできるのですが、
片方のテーブルがリンクサーバ上のテーブルだと、エラーになってしまいます。

なにか設定があるのでしょうか?

ちなみに、処理は次のようなことを行っています。
リンクサーバ側のデータはselectしているだけで、
更新処理はローカルのテーブルのみ行っています。
------------------------------------------------------------------------------------
SqlConnection conn = new SqlConnection (connStr);
//SqlCommand cmd = new SqlCommand(sqlStr1, conn);
SqlCommand cmd = new SqlCommand();

//データベースに接続
conn.Open();

//トランザクションを開始
SqlTransaction sqlTrn= conn.BeginTransaction();
cmd.Connection = conn;
cmd.Transaction = sqlTrn;

try
{
//sql実行
cmd.CommandText = sqlStr1; <--INSER文
cmd.ExecuteNonQuery();
cmd.CommandText = sqlStr2; <--UPDATE文
cmd.ExecuteNonQuery();
cmd.CommandText = sqlStr3; <--UPDATE文
cmd.ExecuteNonQuery();
//コミット
sqlTrn.Commit();
}
catch()
{
sqlTrn.Rollback();
}



------------------------------------------------------------------------------------

それとも、トランザクション機能が使用できないのでしょうか?
よろしくご教授をお願い致します。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-11-13 01:21
まずgoogle。いくつか引っかかったので確認してみてください。

あと、SQLを何回も投げるよりはストアドにまとめてしまうとかしてしまったほうがよいと思います。ストアドにするまでもないなら全部のクエリを足して一回発行すればよい。

#一連の書き込みからたぶんデータベース間の同期とかをやりたいのだと思いますが、定期にやらせるなり、トリガにやらせるなり、ストアドを作ってクライアントからキックさせるなりほぼすべてDBのみで完結するものです。
1

スキルアップ/キャリアアップ(JOB@IT)