初めて投稿します。よろしくお願いします。
VB2008ExpressEditionでADO.Netを使い.mdb(Accessファイル)からデータを取得しています。(DataAdapter使用)
次にDataSetへ格納し、DataSet内でレコードの追加、更新、削除を行い、変更します。
ここまでは正常に動作するのですが、DataSetの変更内容をDataAdapterを通じてUpdateしようとすると、
「同時実行違反 : UpdateCommand によって、処理予定の 1 レコードのうち 0 件が処理されました。」
このような訳の分からないエラーが出てしまいます。
以下に環境とソースを表示しますのでどなたかご教授願えないでしょうか?
・開発環境
OS:WindowsXP ServicePack2
VisualBasic2008 ExpressEdition
Acceess97
mdbファイル名:CreateFile.mdb
テーブル名:CreateTable
・CreateTable内容
バーコード(テキスト型)←主キー
商品番号(テキスト型)
商品名(テキスト型)
色番号(数値型)
サイズ(数値型)
1(数値型)
2(数値型)
3(数値型)
4(数値型)
・・・間同様
11(数値型)
12(数値型)
商品別トータル(数値型)
としています。長いので一旦ここで切ります。
・ソース
①FormDataAddという別フォームに、
バーコード(txtAddBarcode)、商品番号(txtAddBan)、商品名(txtAddName)、色番号(txtAddColor)、サイズ(txtAddSize)、格納番号(txtAddDown)、数値(txtAddSize)というテキストボックスがあり
バーコード〜サイズまでは普通に入力し、格納番号はテーブル内の1〜12に入れる場所を示すものであり(つまり1〜12以外の数値は無い)、数値は格納番号内で示した場所に入れる値をさします。
そして、内容を記入しButtonを押したらFormMainのDataAddサブを実行すると言うものです。
②バーコードを主キーとしていますのでButtonを押した時に同じバーコード値が無ければバーコード〜サイズまでと格納番号で示した所に数値を追加。
さらに格納番号で示した所以外の1〜12の所は0で埋める。
すでに同じバーコードがあると1〜12の値と商品トータルの値のみを変更する(今ある値と今回FormDataAddで入力された格納場所と商品トータル値を加算)。
ちなみにバーコードというのは単なる数値が入ってるものです。
Public Class FormMain
Public Conn As New OleDb.OleDbConnection
Public CreateSelect As New OleDb.OleDbCommand("SELECT * FROM CreateTable", Conn)
Public CreateDAdapter As New OleDb.OleDbDataAdapter(CreateSelect)
Public CreateBuilder As New OleDb.OleDbCommandBuilder(CreateDAdapter)
Public CreateDSet As New DataSet
Private Sub FormMain_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\CreateFile.mdb"
SyohinDAdapter.Fill(CreateDSet)
End Sub
Public Sub DataAdd()
Dim SKey(0) As DataColumn
SKey(0) = CreateDSet.Tables(0).Columns("バーコード")
CreateDSet.Tables(0).PrimaryKey = SKey
Call KeyGet()
Dim KeyRow As DataRow
KeyRow = CreateDSet.Tables(0).Rows.Find(FormDataAdd.txtAddBarcode.Text)
If KeyRow Is Nothing Then
Dim CreateRow As DataRow
CreateRow = CreateDSet.Tables(0).NewRow
CreateRow("バーコード") = FormDataAdd.txtAddBarcode.Text
CreateRow("商品番号") = FormDataAdd.txtAddBan.Text
CreateRow("商品名") = FormDataAdd.txtAddName.Text
CreateRow("色番号") = FormDataAdd.txtAddColor.Text
CreateRow("サイズ") = FormDataAdd.txtAddSize.Text
For i As Integer = 5 To 16
CreateRow(i) = 0
Next
CreateRow(Integer.Parse(FormDataAdd.txtAddDown.Text) + 4) = FormDataAdd.txtAddSu.Text
CreateRow("商品別トータル") = FormDataAdd.txtAddSu.Text
CreateDSet.Tables(0).Rows.Add(CreateRow)
CreateDAdapter.Update(CreateDSet)
Else
Dim KeyNum As Integer = 0
KeyNum = CreateDSet.Tables(0).Rows.IndexOf(KeyRow)
CreateDSet.Tables(0).Rows(KeyNum)(Integer.Parse(FormDataAdd.txtAddDown.Text) + 4) += Integer.Parse(FormDataAdd.txtAddSu.Text)
CreateDSet.Tables(0).Rows(KeyNum)("商品別トータル") += Integer.Parse(FormDataAdd.txtAddSu.Text)
CreateDAdapter.Update(CreateDSet)
End If
End Sub
End Class
※長々となりすいません。
訂正
FormDataAdd内の数値のテキストボックス名はtxtAddSizeでは無く
txtAddSuです。よろしくお願いします。
さらに追加です。すいません。
入力したバーコード値がデータベース内に無ければ追加できるのですが、
ある場合更新作業をする訳ですがその時このエラーメッセージがでます。
ちなみにここでは挙げていませんが、削除した後のUpdateも有効ではないみたいです。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/f3508ba7-3a3b-42c4-8cbd-ae8c968a40c9
にもありますが、
空白のフィールドがありませんか?
過去ログを見ると結構いろいろ出てきます。
http://www.google.com/search?hl=ja&client=opera&rls=en&q=%E5%90%8C%E6%99%82%E5%AE%9F%E8%A1%8C%E9%81%95%E5%8F%8D+UpdateCommand&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=
>ググって見たさん
フィールド名も実際のデータにも空白(語尾にも無し)はありませんでした。
いろいろ私なりに調べましたが同時実行違反もいろいろあり、同じような質問もありましたが、未解決だったりして中々見つけられません。
以前にもこのようなエラーが出て、フィールド名の主キーがNOだったり半角数字のみだったりするとダメみたいですが今回はそのようなフィールド名もつけてません。
Updateの際、DataSetで新たにレコードの追加を行った後のUpdateはOKなのですが、特定の項目のみ変更やレコードの削除を行った後のUpdate時にこのようなエラーがでるようです。
訂正
フォームロード時の
SyohinDAdapter.Fill(CreateDSet)は
CreateDAdapter.Fill(CreateDset)です。
打ち間違えました。
解決しました。
上記の書き込みを行った後、他のフィールド名に半角数字がありますが、
特定の項目のみの変更を行うのですから、そのあたりも影響するのか?
と思いフィールド名を変更したらUpdateできました。
(主キーのみ気をつければ良いのかと思いました。)
ググって見たさんの空白があるのでは?で、禁止ワードを思い出すことができ解決に繋がりました。ありがとうございました。