- PR -

[SQLサーバ2000]トランザクション内でのデータテーブルへの取得

1
投稿者投稿内容
みゅーたん
常連さん
会議室デビュー日: 2005/04/28
投稿数: 31
投稿日時: 2006-06-15 15:34
いつもお世話になっております。
SQLサーバ2000とC#を使っております。

トランザクションをきって、その中でデータテーブルにデータを取得する
コマンドを入れています。

1.トランザクション開始
2.INSERT文
3.データテーブルへのデータ取得
4.INSERT文
5.トランザクション終了
という流れにしたいのですが、
3の部分で

Execute は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまで初期化されていません。

というエラーがでてしまいます。

複数データを保持する(複数行複数内容を個別に保持する)何かよい方法はないでしょうか。

また、データテーブルについて理解せず、サンプルコードをそのまま移してしまったため、
原因がよくわかっていません。
データテーブルの仕組み的にだめなのでは、と思っているのですが・・・。
データテーブルの仕組みが理解できるものがあれば教えてください。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2006-06-29 17:44
引用:

みゅーたんさんの書き込み (2006-06-15 15:34) より:

1.トランザクション開始
2.INSERT文
3.データテーブルへのデータ取得
4.INSERT文
5.トランザクション終了
という流れにしたいのですが、
3の部分で

Execute は、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、トランザクション オブジェクトを持つコマンドが必要です。コマンドの Transaction プロパティがまで初期化されていません。

というエラーがでてしまいます。




お疲れ様です。
TimberLandChapel です。

以下のようなことを行おうとしているといいうことでいいでしょうか?
トランザクション中の更新処理の間に,
トランザクションに参加していない選択は行えません。

かといって,トランザクションに参加することは可能ですが,
根本の話から,
挿入中のテーブルを途中でデータ取得するシナリオ自体を見直さなければいけないと思います。

1.更新に必要な情報を集める
2.トランザクションを開始する
3.実際の更新を行う
4.トランザクションの評価を行う

という自然な流れになるようにもう一度要件を確認してみてください。

[CODE]-----
Const connectionString As String = "Integrated Security=SSPI;Initial Catalog=Test;Data Source=SERVERMETATRON\SANDALPHON;"
Const selectQuery As String = "SELECT * FROM [TestTable] ORDER BY [ID] ASC;"

Dim connection As New SqlClient.SqlConnection(connectionString)
Dim adapter As New SqlClient.SqlDataAdapter(selectQuery, connection)
Dim testTable As New DataTable

adapter.Fill(testTable)

Dim insertQuery As String = "INSERT INTO [Test].[dbo].[TestTable]([DataA], [DataB]) VALUES(@DataA, @DataB);"
Dim insert As New SqlClient.SqlCommand(insertquery, connection)

Try
With insert.Parameters
.Add(New SqlClient.SqlParameter("@DataA", SqlDbType.NChar))
.Add(New SqlClient.SqlParameter("@DataB", SqlDbType.NChar))
End With

connection.Open()
insert.Transaction = connection.BeginTransaction

For counter As Int32 = 4 To 5
With insert.Parameters
.Item("@DataA").Value = counter
.Item("@DataB").Value = counter
End With

insert.ExecuteNonQuery()

' このコメントをはずしてトランザクションに参加すればエラーはでなくなるが。。。
'adapter.SelectCommand.Transaction = insert.Transaction
adapter.Fill(testTable)
Next
insert.Transaction.Commit()

Catch ex As Exception
insert.Transaction.Rollback()
Stop
Finally
connection.Close()
End Try
[CODE]-----

まずはこちらから,参考にしていただけますか。
http://www.microsoft.com/japan/msdn/net/upgrade/adonetprogmsdn.asp

----------
TimberLandChapel
http://blogs.timberlandchapel.com/blogs/timberlandchapel/
1

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