• 締切済み

更新時の「同時実行エラー」の対策

VB.NET2003+Access2000で開発練習中です。 今二つのテーブルにリレーションをかけて、サブフォームからデータの変更・更新をしようとしています。 新規追加は問題なくできていますが、少しデータを変更したり、削除しようとすると「同時実行エラー」が起こります。 テーブルは「メイン」と「サブ」の二つで、それぞれのテーブルにある「伝票No」がキーになっています。 (メイン伝票1枚に複数のサブ伝票がついています) データセットは「DsDenpyou」という名前で両テーブルをセットしています。 データ更新のために   dataadapter1.update(DsDenpyou,"メイン")   dataadapter1.update(DsDenpyou,"サブ") と続けて記述すると、必ずサブのテーブルを更新にいったときにエラーになります。 なにかチェックの方法がありましたらご教示いただけませんか? なお主キーはメインのテーブルの「伝票No」に設定しており、サブには設定していません。 よろしくお願いします。

みんなの回答

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.1

DBConcurrencyExceptionオブジェクトで同時実行違反が発生する原因は取得できますでしょうか。 データセットの関連テーブルを更新する場合は適切な順番で更新して参照整合性の制約に違反しないようにする必要があります。 tryとcatchブロック内でIf・End Ifを使い"メイン"と"サブ"のUpdateメソッドを続けてではなく順に呼び出して更新エラーが起きた場合はエラーを分岐して解決してみてはどうでしょうか。 "メイン"のupdateが完了したら"サブ"のUpdateとなるように。

danchor
質問者

補足

ありがとうございます。 切り分けようと簡単なサンプル(シンプル)データを作ってやってみているんですが、その場合は出ないんです。 メインの方は表示だけさせておいて、サブのデータを変更にいくのですが、同じデータセットに入っているために それぞれがupdateコマンドの対象になっているのですね。 コードを見る限り、メインの方のアップデートが終わってからサブの方にいっていると思っていましたが、違っている? メイン、サブ、またメインサブといっているのでしょうか? とするとどの項目でエラーになるのかを捕まえなければなりませんが、データセットからどういう風にデータが書き込まれるのでしょうか? それをtry~catch文で捕捉する場合、どういう風に記述すればいいのでしょうか? できれば一件一件どこかに表示させてやるとわかりやすいと思うのですが、さてその方法が・・・・。 引き続きよろしくお願いします。

関連するQ&A

  • SQLの同時実行

    SQL文について質問なんですが、下記のようなテーブルがあった場合に『2を3に、3を2にする』というクエリを作ってみましたが、どうもうまくいきません。 ┌─┬──┐ │No│項目│ ├-┼──┤ │1│ああ│ ├─┼──┤ │2│いい│ ├─┼──┤ │3│うう│ └─┴──┘ strSQL1=UPDATE テーブル名 SET No = '2' WHERE No = '3' strSQL2=UPDATE テーブル名 SET No = '3' WHERE No = '2' これをASPから実行する場合は cn.Execute(strSQL1) cn.Execute(strSQL2) とすると、先にstrSQL1が実行されテーブルが更新された後にstrSQL2が実行される ため、 ┌─┬──┐ │No│項目│ ├─┼──┤ │1│ああ│ ├─┼──┤ │3│いい│ ├─┼──┤ │3│うう│ └─┴──┘ となってしまいます。『2つの更新を同時に実行させる』もしくは『2つの更新クエリ1つにする』というようなことはできないものでしょうか?

  • UPDATEを同時に実行する

    UPDATE文について質問なんですが、 下記のクエリのように条件の違うものを一度に実行させるということは可能なのでしょうか? UPDATE テーブル名 SET No = '2' WHERE No = '3' ・・・(1) UPDATE テーブル名 SET No = '3' WHERE No = '2' ・・・(2) (1)を実行し(2)を実行すると、期待通りの結果がどうしても得られません。 どなたかわかる方がいらっしゃれば、よろしくお願いしますm(__)m

  • ACCESS エクセルから インポート

    アクセスは メインテーブルとサブ(サブフォームで入力)からできています。 エクセルのデータは メインの項目名とサブの項目名が入ってます。 エクセルのデータで メインテーブルのキーとなるものは 追加と更新が混在しています。 この状態で エクセルから アクセスのテーブルに インポートする方法がわかりません。 よろしくお願いします。

  • サブフォームをリクエリしたい

    メインフォームのコマンドボタンを押下するとvbaを使ってテーブルのデータを更新します。 メインフォームの中にはサブフォームがあり、 そのサブフォームとテーブルがリンクしています。 サブフォームにはテーブルのデータが表示されており、 メインフォームのコマンドボタン押下→テーブルデータ更新 がされると、全て#Deletedという文字が表示されます。 なので、 Private Sub cmd_データ更新_Click() Call データ更新 Me.Controls("Fサブ").Form.Requery End Sub としたのですが、 「実行時エラー’2465’:指定した式で参照されている’Fサブ’フィールドが見つかりません。」 が発生します。 Me.Controls("Fサブ").Requery これにしても同じでした。

  • VB DB更新時にパラメーターへ値のセット

    データベースの更新についてご指導下さい。 VB2010からSQLサーバーのデータベースに接続しております。 dataAdapter.Updateによりデータベースを更新する際の パラメーターへ値をセットする方法を教えて下さい。 テーブル名Test Code Name ------------ A   Suzuki 希望する処理 テキストボックスに入力された名前に変更 例) Suzuki → Yamada ○フォームの変数として定義 Dim dataAdapter As New SqlDataAdapter Dim dataSet As New DataSet ○FormLoad時にSelectCommandとUpdateCommandを設定 Dim SQL As String = "" Dim command As SqlCommand Dim connection As SqlConnection = New SqlConnection(~) SQL = "SELECT * FROM Test WHERE Code = @code " command = New SqlCommand(SQL, connection) dataAdapter.SelectCommand = command dataAdapter.SelectCommand.Parameters.Add("@code", SqlDbType.Char) SQL = "UPDATE Test SET Name = @name WHERE Code = @code" command = New SqlCommand(SQL, connection) dataAdapter.UpdateCommand = command dataAdapter.UpdateCommand.Parameters.Add("@code", SqlDbType.Char) dataAdapter.UpdateCommand.Parameters.Add("@name", SqlDbType.Text, 50) ○データ表示時にはこれで表示されました。 dataAdapter.SelectCommand.Parameters.Item("@code").Value = ComboBoxCode.text dataAdapter.Fill(dataSet) ○このSelectCommandを参考にこのように書いて見たのですが更新されません。 dataAdapter.UpdateCommand.Parameters.Item("@code").Value = ComboBoxCode.Text dataAdapter.UpdateCommand.Parameters.Item("@name").Value = TextBoxName.Text dataAdapter.Update(dataSet) どのようにしたら実行時にパラメーター化したところへデータをセットできるのでしょうか? データセットに値が入っていないのでは?と予想したのですが…。

  • ntext更新時にエラーが出ます

    こんにちは、vbsでADODBを使ってDBの更新をしたいのですが データ型 ntext の値を更新できずに困ってます。 t_meisaiテーブルのm_syohinの値をbbからaaに変更 update t_meisai set m_syohin = 'aa' where m_syohin = 'bb' というSQL文を実行すると [Microsoft][ODBC SQL Server Driver][SQL Server]データ型 ntext と varchar は equal to 演算子では互換性がありません。 80040E14 というエラーが出て更新できません。 ntextを使わなければいいのでしょうが 仕様の変更は許してもらえませんでした。 どうか、よろしくお願いします。

  • Access2000でメインサブフォーム

    テーブル1 商品ID 数値型(主キー) 商品名 テキスト型 ------------------ テーブル2 売上ID  数値型(主キー) 商品ID  数値型 月日   日付型 売上個数 数値型 --------------------- 以上のようなテーブルがあり、テーブル1を「メイン」テーブル2を「サブ」のメインサブフォームを作成しました。 しかし、「サブ」のデータが多いため、さらに、サブフォームの日付フィールドを使い、抽出をしたいのですが、方法がわかりません。(例えば、9/1以上9/10以下のような抽出) いろいろやってみは見たのですが、思うようにできません。メインサブフォームでさらにサブフォームのデータを抽出するということは無理なのでしょうか?

  • Access2003 サブフォームについて

    サブフォームを持つ画面で 親子テーブルを共に更新しようとしていて挫折しかかっています。 そこで皆様の知恵を借りれれば幸いです。 <<画面表示>> メインフォーム…受注  ┗サブフォーム…受注明細 <<更新条件>> ・メインフォームは変更可能 ・サブフォームは追加、変更、削除可能 ・サブフォームのデータ変更時  →受注明細テーブルを更新しない ・メインフォームのデータ更新時  →受注テーブルを更新しない ・メインフォームの更新ボタン押下時  →受注テーブル、受注明細テーブルを更新 <<質問>> 1.サブフォームの値をテーブルへ  自動更新(項目変更時に付随更新)せずに  任意更新(ボタン押下時など)出来ますか?  [サブフォームに主キー項目を設置せず行追加すると Not Null制約で怒られます。] 2.VBで言うところのFlexGridの様にサブフォームを  制御出来ますか?  RecordSourceを使うのではなく、  VBA内で持っている値を各セルに設定する 3.そもそも同一画面内で親子テーブル共に更新することは  有り得ないことなんでしょうか?

  • ACCESS 合計の更新

    Accessにて、メイン・サブ形式のフォームがあります。 サブフォームには、取引のデータを入力するように設定しています。 ●サブフォーム  日付 重量 ・・・  メインのフォームには、サブフォームの合計の重量を表示させています。 サブフォームにて、重量を入力したときに、合計を更新させたいのですが、 次のレコードに移るなどしないと更新されませんよね? そこで、次のマクロを試してみたのですがうまくいきませんでした。 マクロにて、コントロールの更新後に  ・再クエリ  ・最後のレコードに移動(サブフォームを指定)  ・コントロールの移動 結果は、サブフォームが開いていませんというエラーが表示されます。 重量の間違いをなくすためにも、重量を入力または、更新したときに、 合計の重量も更新したいので、どなたかご教授願います。

  • エクセルからアクセスの更新クエリをVBAで実行したい

    こんばんは。たびたび失礼します。 http://oshiete1.goo.ne.jp/qa4909202.html の続きです。 アクセスの「テーブル1」の「フィールド」(Yes/No型)がFalseなら Trueにする更新クエリをエクセルから実行したいのですがうまく行きません。 Sub test1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & "\\Users\ユーザーアカウント名です\Documents" & "\アクセス.mdb" cn.Execute "UPDATE テーブル1 SET フィールド = False WHERE フィールド='" & True & "'" Set cn = Nothing End Sub これを実行すると 実行時エラー2147217913 抽出条件でデータ型が一致しません。 となります。 どうすればいいでしょうか? ご教授よろしくお願いします。

専門家に質問してみよう