トランザクション文中でSELECT、Fillを使いたい。
- 題名: トランザクション文中でSELECT、Fillを使いたい。
- 著者: ERI
- 日時: 2013/05/18 12:42:40
- ID: 31548
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: トランザクション文中でSELECT、Fillを使いたい。
- 著者: ERI
- 日時: 2013/05/18 12:43:37
- ID: 31549
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: トランザクション文中でSELECT、Fillを使いたい。
- 著者: 魔界の仮面弁士
- 日時: 2013/05/18 18:11:44
- ID: 31550
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: トランザクション文中でSELECT、Fillを使いたい。
- 著者: ERI
- 日時: 2013/05/18 18:53:38
- ID: 31551
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: トランザクション文中でSELECT、Fillを使いたい。
- 著者: ERI
- 日時: 2013/05/20 11:02:05
- ID: 31554
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
お世話になります。
以下、お伺いさせて頂きます。
実際に作成しているコードは、複雑ですので、
同構造の、簡単なコードを使いまして、
ご質問させて頂きます。
SQLServerに、2つのテーブルがあります。
TEST1
氏名(テキスト型)
TEST2
氏名2(テキスト型)
フォームにボタンが1つ、あります。
ボタンを押して、
TESTにデータがない場合、
TESTの氏名に、AをINSERTします。
TESTにデータがある場合、
TESTの氏名を、TEST2の氏名2で、更新します。
以下、コードです。
-----------------------------------------------------------
Private Sub btnTest_Click(以下、略)
Dim cn As New SqlClient.SqlConnection(接続文字列)
Dim cmd As New SqlClient.SqlCommand
Dim ts As SqlClient.SqlTransaction
Dim da As SqlClient.SqlDataAdapter
Dim ds As DataSet
Dim dt As DataTable
Dim dr() As DataRow
Dim da2 As SqlClient.SqlDataAdapter
Dim ds2 As DataSet
Dim dt2 As DataTable
Dim dr2() As DataRow
Dim strSQL As String
Dim strSQL2 As String
Dim strUpdate As String
Dim strInsert As String
Dim strName As String
Try
cn.Open()・・・・・・注1
strSQL = "select * FROM TEST"
da = New SqlClient.SqlDataAdapter(strSQL, cn)
ds = New DataSet
da.Fill(ds, "TEST")・・・・・・注2
dt = ds.Tables("TEST")
dr = dt.Select
ts = cn.BeginTransaction・・・・・・注3
cmd.Transaction = ts・・・・・・注3
If dr.Length = 0 Then
strInsert = "insert into TEST(氏名) values ('A')"
cmd.Connection = cn
cmd.CommandText = strInsert
cmd.ExecuteNonQuery()
Else
strSQL2 = "select 氏名2 FROM TEST2"
da2 = New SqlClient.SqlDataAdapter(strSQL2, cn)
ds2 = New DataSet
da2.Fill(ds, "TEST")・・・・・・注4
dt2 = ds.Tables("TEST")
dr2 = dt.Select
strName = CStr(dr2(0)("氏名2"))
strUpdate = "update TEST set 氏名 = '" & strName & "'"
cmd.Connection = cn
cmd.CommandText = strUpdate
cmd.ExecuteNonQuery()
End If
ts.Commit()
Catch ex As Exception
(略)
Finally
(略)
End Try
End Sub
-----------------------------------------------------------
上記を実行しますと、
注4の行で、エラーが発生します。
「Executeは、コマンドに割り当てられた接続が保留状態であるローカルのトランザクションにあるとき、
トランザクションオブジェクトを持つコマンドが必要です。
コマンドのTransactionプロパティまで初期化されていません。」
これと、同じ内容のエラーが、注3を、注1の直下に置いても、
注2の行で、発生します。
この場合は、他のサイトを調べまして、注3を、注2の後に置けばいい、と、分かりまして、
そのように、致しました。
ただ、注4の場合、注3を、注4の下に置くことが、出来ません。
da2.Fillを使う代わりに、
cmd.Connection = cn
cmd.CommandText = strSQL2
strName = CStr(cmd.ExecuteScalar)
と、置き換えますと、エラーは出ないのですが、
実際に作成しているコードでは、ここで、Fillを使いたい状況が、ございます。
この、Fillの部分を、そのまま残した上で、
このエラーを回避するための方法が、ございましたら、
ご教示頂きたいと、存じます。
どうぞよろしくお願い申し上げます。