同時実行違反にならないようにするには?

解決


ペン  2009-09-25 14:50:39  No: 142555  IP: 192.*.*.*

初めて投稿します。よろしくお願いします。
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(数値型)
商品別トータル(数値型)

としています。長いので一旦ここで切ります。

編集 削除
ペン  2009-09-25 15:30:44  No: 142556  IP: 192.*.*.*

・ソース
①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

※長々となりすいません。

編集 削除
ペン  2009-09-25 15:39:27  No: 142557  IP: 192.*.*.*

訂正
FormDataAdd内の数値のテキストボックス名はtxtAddSizeでは無く
txtAddSuです。よろしくお願いします。

編集 削除
ペン  2009-09-25 15:52:32  No: 142558  IP: 192.*.*.*

さらに追加です。すいません。
入力したバーコード値がデータベース内に無ければ追加できるのですが、
ある場合更新作業をする訳ですがその時このエラーメッセージがでます。
ちなみにここでは挙げていませんが、削除した後のUpdateも有効ではないみたいです。

編集 削除
ググって見た  2009-09-25 17:56:06  No: 142559  IP: 192.*.*.*

http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/f3508ba7-3a3b-42c4-8cbd-ae8c968a40c9

にもありますが、
空白のフィールドがありませんか?

編集 削除
ググって見た  2009-09-25 17:57:23  No: 142560  IP: 192.*.*.*

過去ログを見ると結構いろいろ出てきます。

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=

編集 削除
ペン  2009-09-26 08:52:18  No: 142561  IP: 192.*.*.*

>ググって見たさん
フィールド名も実際のデータにも空白(語尾にも無し)はありませんでした。
いろいろ私なりに調べましたが同時実行違反もいろいろあり、同じような質問もありましたが、未解決だったりして中々見つけられません。
以前にもこのようなエラーが出て、フィールド名の主キーがNOだったり半角数字のみだったりするとダメみたいですが今回はそのようなフィールド名もつけてません。

Updateの際、DataSetで新たにレコードの追加を行った後のUpdateはOKなのですが、特定の項目のみ変更やレコードの削除を行った後のUpdate時にこのようなエラーがでるようです。

訂正
フォームロード時の
SyohinDAdapter.Fill(CreateDSet)は
CreateDAdapter.Fill(CreateDset)です。
打ち間違えました。

編集 削除
ペン  2009-09-26 09:10:04  No: 142562  IP: 192.*.*.*

解決しました。
上記の書き込みを行った後、他のフィールド名に半角数字がありますが、
特定の項目のみの変更を行うのですから、そのあたりも影響するのか?
と思いフィールド名を変更したらUpdateできました。
(主キーのみ気をつければ良いのかと思いました。)

ググって見たさんの空白があるのでは?で、禁止ワードを思い出すことができ解決に繋がりました。ありがとうございました。

編集 削除