- - PR -
リンクサーバを利用したSQLのトランザクション処理について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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(); } ・ ・ ・ ------------------------------------------------------------------------------------ それとも、トランザクション機能が使用できないのでしょうか? よろしくご教授をお願い致します。 |
|
投稿日時: 2004-11-13 01:21
まずgoogle。いくつか引っかかったので確認してみてください。
あと、SQLを何回も投げるよりはストアドにまとめてしまうとかしてしまったほうがよいと思います。ストアドにするまでもないなら全部のクエリを足して一回発行すればよい。 #一連の書き込みからたぶんデータベース間の同期とかをやりたいのだと思いますが、定期にやらせるなり、トリガにやらせるなり、ストアドを作ってクライアントからキックさせるなりほぼすべてDBのみで完結するものです。 |
1