2017.
04.
22
12:09:17
結論から書きます。
いろいろな原因が考えられるようですが、今回の私の場合は
DBに更新対象のレコードが無かった
のが原因でした。
エラー自体の意味は
1.おまえがデータを持って行った後で
2.そのデータを誰かが更新したっぽいよ
3.なんか矛盾が起きるとイヤだから、おまえの依頼は無視するね
みたいです。
それでは詳細……と言うほどでもないですが、詳細を書いていきます。
DataGridViewのデータソースに外部結合したクエリを指定したのですよ。
やったのは、こんな感じの処理ですφ(--)
tbl1に対してtbl2を外部結合しているので、
当然、tbl1にはあるけどtbl2にはないデータが存在します。
DataGridViewの入力内容を丸ごとtbl2に反映させたかったので
駄目元で、こんな感じの更新処理を書きましたφ(--)
案の定、ダメでした(-A-)
tbl2にあるデータをDataGridView上で編集したときは上手く動きましたが、
tbl2にないデータをDataGridView上で編集したときにエラーになりました。
それは、そうか(--ゞ
多分、プログラムはUpdateをするのでしょう。
ですが、実際に必要なのはInsertです。
自動で判断してUpdateとInsertを切り替えてくれないかな~と期待したのですが
切り替えてくれませんでした。
エラーになりました。
そのときのエラーが
だったのです。
おそらく、誰か別の人が更新したことによって
更新対象のレコードが無くなったと判断したのでしょうね。
実際には最初から無かったわけですが(^^ゞ
ということで、UpdateCommandを実行したときに
DBに更新対象のレコードが無い
場合もエラーとしては「同時実行違反」になるようです。
そんな感じ\(--)/
いろいろな原因が考えられるようですが、今回の私の場合は
DBに更新対象のレコードが無かった
のが原因でした。
エラー自体の意味は
1.おまえがデータを持って行った後で
2.そのデータを誰かが更新したっぽいよ
3.なんか矛盾が起きるとイヤだから、おまえの依頼は無視するね
みたいです。
それでは詳細……と言うほどでもないですが、詳細を書いていきます。
DataGridViewのデータソースに外部結合したクエリを指定したのですよ。
やったのは、こんな感じの処理ですφ(--)
Dim cn As String = 【DB接続文字列】
Dim ds As New DataSet()
Dim da As SqlClient.SqlDataAdapter
' 実行する SQL コマンドを設定する
Dim sb As New System.Text.StringBuilder
sb.AppendLine("SELECT ")
sb.AppendLine(" t1.key")
sb.AppendLine(" ,t1.t1_column1")
sb.AppendLine(" ,t2.t2column2")
sb.AppendLine(" ,t2.t2column3")
sb.AppendLine("FROM ")
sb.AppendLine(" tbl1 t1 ")
sb.AppendLine("LEFT OUTER JOIN ")
sb.AppendLine(" tbl2 t2")
sb.AppendLine("ON ")
sb.AppendLine(" t1.key = t2.key")
'DataGridViewに表示
da = New SqlClient.SqlDataAdapter(sb.ToString, cn)
da.Fill(ds, "tbl2")
DataGridView1.DataSource = ds.Tables("tbl2")
Dim ds As New DataSet()
Dim da As SqlClient.SqlDataAdapter
' 実行する SQL コマンドを設定する
Dim sb As New System.Text.StringBuilder
sb.AppendLine("SELECT ")
sb.AppendLine(" t1.key")
sb.AppendLine(" ,t1.t1_column1")
sb.AppendLine(" ,t2.t2column2")
sb.AppendLine(" ,t2.t2column3")
sb.AppendLine("FROM ")
sb.AppendLine(" tbl1 t1 ")
sb.AppendLine("LEFT OUTER JOIN ")
sb.AppendLine(" tbl2 t2")
sb.AppendLine("ON ")
sb.AppendLine(" t1.key = t2.key")
'DataGridViewに表示
da = New SqlClient.SqlDataAdapter(sb.ToString, cn)
da.Fill(ds, "tbl2")
DataGridView1.DataSource = ds.Tables("tbl2")
tbl1に対してtbl2を外部結合しているので、
当然、tbl1にはあるけどtbl2にはないデータが存在します。
DataGridViewの入力内容を丸ごとtbl2に反映させたかったので
駄目元で、こんな感じの更新処理を書きましたφ(--)
da.InsertCommand = New SqlClient.SqlCommand
da.InsertCommand.Connection = cSqlConnection
da.InsertCommand.CommandText = "INSERT INTO tbl2 (t2column2, t2column3) VALUES(@t2column2, @t2column3)"
da.InsertCommand.Parameters.Add("@t2column2", SqlDbType.NVarChar, 255, "column2")
da.InsertCommand.Parameters.Add("@t2column3", SqlDbType.NVarChar, 255, "column3")
da.UpdateCommand = New SqlClient.SqlCommand
da.UpdateCommand.Connection = cSqlConnection
da.UpdateCommand.CommandText = "UPDATE tbl2 SET t2column2= @t2column2, t2column3 = @t2column3 WHERE key = @key"
da.UpdateCommand.Parameters.Add("@t2column2", SqlDbType.NVarChar, 255, "column2")
da.UpdateCommand.Parameters.Add("@t2column3", SqlDbType.NVarChar, 255, "column3")
da.UpdateCommand.Parameters.Add("@key", SqlDbType.Int, 4, "key")
'DB更新
da.Update(DataGridView1.DataSource)
da.InsertCommand.Connection = cSqlConnection
da.InsertCommand.CommandText = "INSERT INTO tbl2 (t2column2, t2column3) VALUES(@t2column2, @t2column3)"
da.InsertCommand.Parameters.Add("@t2column2", SqlDbType.NVarChar, 255, "column2")
da.InsertCommand.Parameters.Add("@t2column3", SqlDbType.NVarChar, 255, "column3")
da.UpdateCommand = New SqlClient.SqlCommand
da.UpdateCommand.Connection = cSqlConnection
da.UpdateCommand.CommandText = "UPDATE tbl2 SET t2column2= @t2column2, t2column3 = @t2column3 WHERE key = @key"
da.UpdateCommand.Parameters.Add("@t2column2", SqlDbType.NVarChar, 255, "column2")
da.UpdateCommand.Parameters.Add("@t2column3", SqlDbType.NVarChar, 255, "column3")
da.UpdateCommand.Parameters.Add("@key", SqlDbType.Int, 4, "key")
'DB更新
da.Update(DataGridView1.DataSource)
案の定、ダメでした(-A-)
tbl2にあるデータをDataGridView上で編集したときは上手く動きましたが、
tbl2にないデータをDataGridView上で編集したときにエラーになりました。
それは、そうか(--ゞ
多分、プログラムはUpdateをするのでしょう。
ですが、実際に必要なのはInsertです。
自動で判断してUpdateとInsertを切り替えてくれないかな~と期待したのですが
切り替えてくれませんでした。
エラーになりました。
そのときのエラーが
System.Data.DBConcurrencyException: 同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。
だったのです。
おそらく、誰か別の人が更新したことによって
更新対象のレコードが無くなったと判断したのでしょうね。
実際には最初から無かったわけですが(^^ゞ
ということで、UpdateCommandを実行したときに
DBに更新対象のレコードが無い
場合もエラーとしては「同時実行違反」になるようです。
そんな感じ\(--)/