プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
VB.net「System.Data.DBConcurrencyException: 同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。」なエラーが出た
結論から書きます。
いろいろな原因が考えられるようですが、今回の私の場合は

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")

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)

案の定、ダメでした(-A-)
tbl2にあるデータをDataGridView上で編集したときは上手く動きましたが、
tbl2にないデータをDataGridView上で編集したときにエラーになりました。

それは、そうか(--ゞ
多分、プログラムはUpdateをするのでしょう。
ですが、実際に必要なのはInsertです。
自動で判断してUpdateとInsertを切り替えてくれないかな~と期待したのですが
切り替えてくれませんでした。
エラーになりました。

そのときのエラーが

System.Data.DBConcurrencyException: 同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。

だったのです。

おそらく、誰か別の人が更新したことによって
更新対象のレコードが無くなったと判断したのでしょうね。

実際には最初から無かったわけですが(^^ゞ

ということで、UpdateCommandを実行したときに

DBに更新対象のレコードが無い

場合もエラーとしては「同時実行違反」になるようです。

そんな感じ\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● VB.NET  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事