SQLServerのテーブルで、INSERTした行のみの内容を、UPDATEするには。
- 題名: SQLServerのテーブルで、INSERTした行のみの内容を、UPDATEするには。
- 著者: ERI
- 日時: 2013/05/13 19:52:21
- ID: 31529
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: SQLServerのテーブルで、INSERTした行のみの内容を、UPDATEするには。
- 著者: とん。
- 日時: 2013/05/13 21:21:13
- ID: 31530
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: SQLServerのテーブルで、INSERTした行のみの内容を、UPDATEするには。
- 著者: ERI
- 日時: 2013/05/13 22:27:26
- ID: 31531
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: SQLServerのテーブルで、INSERTした行のみの内容を、UPDATEするには。
- 著者: もりお
- 日時: 2013/05/15 0:56:00
- ID: 31534
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: SQLServerのテーブルで、INSERTした行のみの内容を、UPDATEするには。
- 著者: ERI
- 日時: 2013/05/16 11:01:04
- ID: 31540
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: SQLServerのテーブルで、INSERTした行のみの内容を、UPDATEするには。
- 著者: ERI
- 日時: 2013/05/18 12:28:06
- ID: 31547
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
お世話になります。
以下、ご質問させて頂きます。
MicrosoftSQLServerのデータベースに、2つのテーブルがあります。
(テーブル名)
T_FROM
(フィールド)
FROMID(主キー、オートナンバー)
数値(数値型)
(テーブル名)
T_TO
(フィールド)
TOID(主キー、オートナンバー)
数値1(数値型)
数値2(数値型)
数値3(数値型)
移行ボタン(btnIko)をクリックすると、
T_FROMの[数値]に入っている数値を、上から順番に、
T_TOの[数値1]〜[数値3]に、移行していきたいと、考えております。
例えば、
T_FROM
数値
1
2
3
4
5
と、入っている場合、
T_FROM
数値1 数値2 数値3
1 2 3
4 5 0
となります。
以下が、その、コードです。
--------------------------------------------------------------------------
Private Sub btnIko_Click(以下、略)
Dim cn As New SqlClient.SqlConnection(接続文字列)
Dim n As Integer
Dim i As Integer
Dim strSQL As String
Dim strValue As String
Dim strIns As String
Dim strUpd As String
Dim da As SqlClient.SqlDataAdapter
Dim ds As DataSet
Dim dt As DataTable
Dim dr() As DataRow
Dim cmdIns As SqlClient.SqlCommand
Dim cmdUpd As SqlClient.SqlCommand
Try
cn.Open()
strSQL = "select * from [T_FROM] order by [FROMID]"
da = New SqlClient.SqlDataAdapter(strSQL, cn)
ds = New DataSet
da.Fill(ds, "T_FROM")
dt = ds.Tables("T_FROM")
dr = dt.Select
n = 0
i = 0
For i = 0 To dr.Length - 1
If n = 0 Then
strValue = ""
strValue &= "0,0,0"
strIns = "insert into [T_TO]([数値1],[数値2],[数値3]) values (" & strValue & ")"
cmdIns = New SqlClient.SqlCommand(strIns, cn)
cmdIns.ExecuteNonQuery()
End If
strUpd = ""
Select Case n
Case 0
strUpd &= "update [T_TO] set [数値1] = " & CInt(dr(i)("数値")) & ""
Case 1
strUpd &= "update [T_TO] set [数値2] = " & CInt(dr(i)("数値")) & ""
Case 2
strUpd &= "update [T_TO] set [数値3] = " & CInt(dr(i)("数値")) & ""
End Select
cmdUpd = New SqlClient.SqlCommand(strUpd, cn)
cmdUpd.ExecuteNonQuery()
If n = 2 Then
n = 0
Else
n = n + 1
End If
Next
dr = Nothing
da = Nothing
dt = Nothing
dr = Nothing
MsgBox("変換完了しました。")
Catch ex As Exception
MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Error)
Finally
End Try
End Sub
------------------------------------------------------------------------
上記のコードを実行すると、
T_FROM
数値1 数値2 数値3
4 5 3
4 5 0
という結果に、なってしまいます。
上記のUPDATE文(strUpd)で、UPDATEを実行する直前にINSERTした行、を、指定することが出来ていないため、
すべての行に対して、UPDATEが実行されてしまっています。
この、INSERTした行を、UPDATE文中で、いかに指定したらよいか、悩んでおります。
これが、MicrosoftAccessのSELECT文の場合は、T_TOの[TOID]を昇順に並べておき、SELECT LAST 1 文を使うか、
または、降順に並べておき、SELECT TOP 1 文を使うか、の、方法があると思いますが、
この、メソッドも、調べますと、ORDER BYは考慮せず、テーブルに格納された順番に従うため、期待通りの結果を取得しない場合がある、と、ありました。
SQLServerでは、使用出来ない、書き方です。
また、T_TOに、新たなフラグフィールドを追加して、
INSERT実行前に、一度、すべてクリアして、
INSERTした際に、その行にのみ、フラグを立てる、という方法も、
考えられますが、
T_TOに、フィールドを増やすことが出来ない、という、現状が、ございます。
お分かりになられる方がいらっしゃいましたら、ご教示くださいませ。
どうぞ、よろしくお願い申し上げます。