• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ヘルプのSQLが動きません)

ヘルプのSQLが動かない?!VB.NET+Access2000環境での同時実行違反の解決方法

このQ&Aのポイント
  • データ更新時の「同時実行違反」解決のため、MSのヘルプから処理方法を探し、書かれていたSQLをそのまま動かそうとしているのですが、何か抜けているのかビルドエラーになります。
  • Ctype(ex.Row.ltem(0), String)と書かれているのですが、ex.Row に波下線が入り文法上の記述間違いのような指摘が出てくるのですが、Ctypeの構文がおかしいのでしょうか?
  • エラーの箇所をなんとか特定したいと頑張っています。よろしくご助言をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

WHERE 句に全部載せているのですね? こういった場合、オリジナルの値を保持していないと、WHERE句引数値に該当する値が、既にデータセット内部で変更されているために、値を更新できないと思います。 >>更新は、キー項目に変更をかけていませんか? >>そうでなければ、更新でこけているのは非常に不思議です >ここがよく理解できてないんです。 >「キー項目に変更をかける」とは? 更新前のオリジナル値を持っていない場合は、キー項目の編集はご法度です。 WHERE句に設定する値は、ヘンゼルとグレーテルが元の場所へ辿るために置いておいたパンくずのようなものです。 更新後の値が入ったデータセットを、ホイと渡しても、Update文に設定するWHERE句の条件値には、更新後の値が条件として使用されます。 したがって、元の値(更新すべき対象)が行方不明となります。 全ての更新前のオリジナル値を持っていなければ、キー項目の編集を不可にしておき、それを頼りに、更新対象のWHERE句に設定できます。 質問者さんは >キーは日報NO であれば 日報NOの編集は不可にし、WHERE句を日報NOだけにすることにより、更新が可能となります。 削除も同様で、WHERE句を日報NOだけにすることにより、可能となります。 >データセットが同じDsReport1なのでどちらのテーブルの日報NOも読み込まれて更新に行くのでしょうか? >でもどちらかをはずすと関連づけがうまくいかないのではないでしょうか。 質問者さんの当初のアダプタ.Updateは、引数にテーブルを指定しているので、指定したテーブルのみが更新対象です。 私の示した6回のUpdate()メソッド発行での方法は、個別のテーブルからデータロウ配列を取り出しておりますので、対象となるデータテーブル以外は参照いたしません。 それと気になったのですが、、、SQL文は「?」(クエッション)を利用しているのですか? 業務であれば、パラメータ系のクラスを利用し、データテーブルのどのカラムが、どのSQL文とリンクしているかを明示した方が、良いと思います。 もしoledbを利用しているなら、OleDb.OleDbParameterというのがあります。 SqlClientならSqlClient.SqlParameterもあります。 OleDbParameterで検索をしたら見易いサンプルがあったので張っておきます。 http://park5.wakwak.com/~weblab/clsDBIO.html

danchor
質問者

お礼

いろいろとご教示ありがとうございます。 あれから試行錯誤を繰り返していますが、まだ解決には至っておりません。 もう少しじっくりと考えて取り組んでみます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.5

先ほどの例のテーブルが間違ったので、もう一度と。。。 '削除:サブ odaSub.Update(l_dtbSub.Select("", "", DataViewRowState.Deleted)) '削除:メイン odaMain.Update(l_dtbMain.Select("", "", DataViewRowState.Deleted)) '更新:メイン odaMain.Update(l_dtbMain.Select("", "", DataViewRowState.ModifiedCurrent)) '更新:サブ odaSub.Update(l_dtbSub.Select("", "", DataViewRowState.ModifiedCurrent)) '追加:メイン odaMain.Update(l_dtbMain.Select("", "", DataViewRowState.Added)) '追加:サブ odaSub.Update(l_dtbSub.Select("", "", DataViewRowState.Added))

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

各アダプタの DeleteCommand() UpdateCommand() InsertCommand() のSQL文と、それぞれのSQLへのパラメータが、正常に設定されていることを前提にお話いたします。 >'データベースを更新 >odaMain.Update(DsReport1, "T_メイン") >odaSub.Update(DsReport1,"T_サブ") これは削除の時は、親を先に消しこもうとしますよね。 削除の時は、先にサブを消さなければなりません。だから削除はこけます。 更新は、キー項目に変更をかけていませんか? そうでなければ、更新でこけているのは非常に不思議です、、、(アダプタのUpdateCommand.CommandTextや引数を要確認) データセットの変更値の反映は、メインとサブの追加/更新/削除を個別にUpdateをかける必要があります。 Dim l_dtbMain As DataTable = DsReport1.Tables("T_メイン") Dim l_dtbSub As DataTable = DsReport1.Tables("T_サブ") '削除:サブ odaSub.Update(l_dtbSub.Select("", "", DataViewRowState.Deleted)) '削除:メイン odaMain.Update(l_dtbMain.Select("", "", DataViewRowState.Deleted)) '更新:メイン odaMain.Update(l_dtbSub.Select("", "", DataViewRowState.ModifiedCurrent)) '更新:サブ odaSub.Update(l_dtbSub.Select("", "", DataViewRowState.ModifiedCurrent)) '追加:メイン odaMain.Update(l_dtbMain.Select("", "", DataViewRowState.Added)) '追加:サブ odaSub.Update(l_dtbMain.Select("", "", DataViewRowState.Added))

danchor
質問者

補足

>更新は、キー項目に変更をかけていませんか? >そうでなければ、更新でこけているのは非常に不思議です ここがよく理解できてないんです。 「キー項目に変更をかける」とは? 先ほどサブのupdateのSQLを載せましたが、字数制限で載せられなかったメインのSQLを書きます。(長くてすみません) ------------------------ UPDATE [T_メイン] SET 日報NO = ?, 日付 = ?, 指示NO = ?, 車番 = ?, 運転手 = ?, 管轄支店 = ?, 出発地 = ?, 出発時 = ?, 出発分 = ?, [発メーター] = ?, 天候 = ?, 到着地 = ?, 到着時 = ?, 到着分 = ?, [着メーター] = ?, 給油地 = ?, 給油量 = ?, 給油支払額 = ?, 高速料金 = ?, その他料金 = ?, 特記事項 = ? WHERE (日報NO = ?) AND (その他料金 = ? OR ? IS NULL AND その他料金 IS NULL) AND (出発分 = ? OR ? IS NULL AND 出発分 IS NULL) AND (出発地 = ? OR ? IS NULL AND 出発地 IS NULL) AND (出発時 = ? OR ? IS NULL AND 出発時 IS NULL) AND (到着分 = ? OR ? IS NULL AND 到着分 IS NULL) AND (到着地 = ? OR ? IS NULL AND 到着地 IS NULL) AND (到着時 = ? OR ? IS NULL AND 到着時 IS NULL) AND (天候 = ? OR ? IS NULL AND 天候 IS NULL) AND (指示NO = ? OR ? IS NULL AND 指示NO IS NULL) AND (日付 = ? OR ? IS NULL AND 日付 IS NULL) AND (特記事項 = ? OR ? IS NULL AND 特記事項 IS NULL) AND ([発メーター] = ? OR ? IS NULL AND [発メーター] IS NULL) AND ([着メーター] = ? OR ? IS NULL AND [着メーター] IS NULL) AND (管轄支店 = ? OR ? IS NULL AND 管轄支店 IS NULL) AND (給油地 = ? OR ? IS NULL AND 給油地 IS NULL) AND (給油支払額 = ? OR ? IS NULL AND 給油支払額 IS NULL) AND (給油量 = ? OR ? IS NULL AND 給油量 IS NULL) AND (車番 = ? OR ? IS NULL AND 車番 IS NULL) AND (運転手 = ? OR ? IS NULL AND 運転手 IS NULL) AND (高速料金 = ? OR ? IS NULL AND 高速料金 IS NULL) ------------------------ キーは日報NOで両テーブルとも同じ名前です。 データセットが同じDsReport1なのでどちらのテーブルの日報NOも読み込まれて更新に行くのでしょうか? でもどちらかをはずすと関連づけがうまくいかないのではないでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

ありがとうございます。 >おかげさまでHELPからの情報はうまく動くようになりました。 ん?私のは、ヘルプのまま張ったようなもんですが・・・・ なぜ、うまくいかなかったのですか? こういう場合は、どこをどのように修正したかを公開しましょうね^^; 私が認識している状況は >Catch ex As DBConcurrencyException を利用していることから ・「アダプタを利用した更新」でこけている ということだけです。 追加/更新/削除のどれでこけているかもわかりませんが、いずれかのSQL文の設定が間違っているかも知れません。 キー項目を更新しようとしてこけているのかも知れません。 追加順序が、DBのリレーショナルに添わないで行われている。あるいは追加更新削除が一度で行われていて、その全ての更新順序が、DBのリレーショナルに添わないで行われようとしているのかも知れません。 とりあえず・・・・ >特におかしなところを見つけることができませんでした。 こういう場合、エラーが起きているのだから、そのアダプタ.Updateを行っている一連の処理を公開しないと。。。 これ以上の事は何も言えませんが。。。。

danchor
質問者

補足

たびたびありがとうございます。 >なぜ、うまくいかなかったのですか? >こういう場合は、どこをどのように修正したかを公開しましょうね^^; すみません。 深く考えていなかったもので・・・。 何をしたかというと、1050YENさんが示していただいたHELPをそのまま使ったと言うだけです。 なぜ前のが動かなかったかまで戻らなかったもので。 もう一点。 確かに断片的ではなく流れに沿った状況を示さないと解らないですよね。これも申し訳ありませんでした。 以下が今困っているルーティンです。 ------------------------ Private Sub mnuFileExit_Click(ByVal sender As Object, ByVal e As System.EventArgs)_ Handles mnuFileExit.Click '現在の編集を終了する Call ChkEdit() 'データベースを更新 odaMain.Update(DsReport1, "T_メイン") odaSub.Update(DsReport1,"T_サブ") 'アプリケーションを終了する Application.Exit() End Sub Private Sub ChkEdit() 'データグリッドの編集を終了する Me.BindingContext(DsReport1, "T_メイン.subNippo").EndCurrentEdit() End Sub ------------------------ 終了のボタンをクリックしたら編集を終了して、メインとサブの両DBにデータを更新に行く というストーリーなのですが、データグリッドを使用して表示させているサブのテーブルのみが編集できません。 このときに「同時実行違反」のエラーが出ます。 なお新規追加は問題なく実行できます。 削除と更新で引っかかります。 UPDATEのSQLは以下の通りです。 UPDATE [T_サブ] SET 荷主 = ?, 休憩時間 = ?, 作業時間 = ?, 運賃 = ?, 重量 = ?, 出発時 = ?, 出発分 = ?, 待ち時間 = ?, 地名 = ?, [着メーター] = ?, 到着時 = ?, 到着分 = ?, 特記事項 = ?, 日報NO = ?, 品名 = ? WHERE (荷主 = ?) AND (休憩時間 = ?) AND (作業時間 = ?) AND (運賃 = ?) AND (重量 = ?) AND (出発時 = ?) AND (出発分 = ?) AND (待ち時間 = ?) AND (地名 = ?) AND ([着メーター] = ?) AND (到着時 = ?) AND (到着分 = ?) AND (特記事項 = ?) AND (日報NO = ?) AND (品名 = ?) 実際のコードを編集せずに転記しましたのでわかりにくいかもしれませんが、変に細工をして問題を見えなくするよりもと思いましたのであえて載せました。 うまく動くインサートも必要であれば載せますのでご指示ください。 よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

.NET2002ですが、今やってみました。 ヘルプのIDが異なるので、以下を参考に実験しました。 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/Vbcon/html/vbtskCatchingConcurrencyError.asp Try   アダプタ.Update() Catch ex As DBConcurrencyException   Dim customErrorMessage As String   customErrorMessage = "Concurrency violation" & vbCrLf   customErrorMessage &= ex.Row(0).ToString   MessageBox.Show(customErrorMessage) End Try 構文エラーは私のところでは発生しませんでした。 そして普通に、エラーが発生したレコードの先頭アイテムの情報が出力されました。。。 >構文が間違ってるぞ! というメッセージですよね。これは。 だとは思うのですが、、、 タスク一覧で、その構文がどようにまずいのかが出力されていると思います。 そちらを確認しましたか?

danchor
質問者

補足

ありがとうございます。 おかげさまでHELPからの情報はうまく動くようになりました。 表示されるConcurrency Violationは [データセット名+サブテーブル名Row] ということでどうも変更されたレコードの先頭で発生しているようです。 その後15列あるサブテーブルのデータを Row()とItem()で一つ一つ表示させてみましたが、特におかしなところを見つけることができませんでした。 次にやる手だて(チェック)はどのようにすれば良いでしょうか? ちなみに一番最初のデータはメインとサブを連携するキーフィールドです。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

>Ctype(ex.Row.ltem(0), String) >ex.Row に波下線 exはデータテーブルですよね? Ctype(ex.Rows(0からのロウ番号を指定).ltem(0), String) ではだめですか?

danchor
質問者

補足

早速ありがとうございます。 投稿(質問)する前に試してみたのですが、Rows()でも Rowでも結果は同じでした。(括弧の中の数字はどれでも一緒) 構文が間違ってるぞ! というメッセージですよね。これは。 exは  Catch ex As DBConcurrencyException という風にかかれています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SQL構文エラー

    SQL構文エラーがでているのですが、どこが悪いのか 見つける事ができません。 SQLのデバッグツールなどはないのでしょうか? なるべくフリーソフトでなんですけど 知っている方がいたら教えて下さい。 言語:VB6.0 SP5 DB:Access  Vectorなどで探したのですが、シェアなどがおおかったです。

  • FindFirstVolumeでドライブパスを取得しようと思ったのですが、

    MSDNライブラリに ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/jpfileio/html/_win32_findfirstvolume.htm ヘッダー:winbase.h 内で宣言 インポートライブラリ:kernel32.lib を使用 とのことなのでそのとおりしましたが、 error C3861: 'FindFirstVolume': 識別子は、引数依存の照合を使用しても見つかりません。 というエラーが表示されます。 MFCを使用しています。 どうすればタイトルの関数を使用できるようになりますでしょうか? よろしくお願いします。

  • ヘルプファイルをvbaで操作したいのですが

    Sub Sample() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "ms-help://MS.MSACCESS.DEV.14.1041/MSACCESS.DEV/content/HV10343780.htm" Set objIE = Nothing End Sub だと 実行時エラー 5 プロシージャの呼び出し、または引数が不正です。 になります。 何で見れないのでしょうか? 手作業でブラウザではなくフォルダのアドレスに ms-help://MS.MSACCESS.DEV.14.1041/MSACCESS.DEV/content/HV10343780.htm を入れて エンターを押せばブラウザ上で表示できます。 win7 エクセル2010です。

  • VBでSQL文のUPDATE構文を使った時のエラーについて

    こんにちは。全くのVB初心者ですが回答、ご指摘のほうよろしければお願いします。 Microsoft Visual Studio 2005でデータベース管理のアプリケーションを制作しているんですが、エラーが出て困っています。 本フォームの各Textboxの編集した値を、 利用者カルテフォーム(別フォーム)のDataGridViewとデータベースに反映させるというプログラミングにしようとしています。 以下のコードでデバッグしようとしても「UPDATE ステートメントの構文エラーです。」というエラーメッセージが出てきて実行できない状態です。 VB中学校というサイトのデータベース講座を参考にしました。 ------------------------------------------------------------ Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim Cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:xxxx.mdb") Dim SQLCm As OleDbCommand = Cn.CreateCommand Dim Table As DataTable = DirectCast(利用者カルテDataGridView1.DataSource, DataTable) Dim Row As DataRow Dim Adapter As New OleDbDataAdapter(SQLCm) Row = Table.NewRow Row("No") = NotextBox.Text Row("名前") = 名前TextBox.Text Row("フリガナ") = フリガナTextBox.Text Table.Rows.Add(Row) Dim SQL As String = "" SQL = "UPDATE 患者データ SET " SQL &= " No = " & Row("No") & "', " SQL &= " 名前 = '" & Row("名前") & "', " SQL &= " フリガナ= " & Row("フリガナ") & "', " SQL &= " WHERE " SQL &= " No = " & NotextBox.Text SQLCm.CommandText = SQL Cn.Open() ※SQLCm.ExecuteNonQuery() Cn.Close() 利用者カルテ.Show() Table.Dispose() Adapter.Dispose() SQLCm.Dispose() Cn.Dispose() End Sub ---------------------------------------------------------- 以上が実際にエラーがでる部分になります。 ※の部分で「UPDATE ステートメントの構文エラーです。」というエラーが指摘されています。 ちなみに他のフォームでINSERT文も使っているのですが、そちらは問題なく実行できる状態です。 初歩的な質問で申し訳ないですが、よければ回答のほうよろしくお願いします。

  • SQL Server2008 の解析

    SQL Server2008でパフォーマンスの悪いSQLなどを調べようと思い、 以下のような説明を参考にしています。 http://msdn.microsoft.com/ja-jp/magazine/cc135978.aspx http://msdn.microsoft.com/ja-jp/library/ms189741.aspx しかし、エラーが出て実行できません。 SQL文から抜粋しますと、以下の様なエラーが発生ます。  ・THEN LEN(CONVERT(nvarchar(max), qt.text)) * 2    →'max' の近くに無効な構文があります。  ・CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt    →'APPLY' の近くに無効な構文があります。  ・SELECT qs.execution_count   FROM sys.dm_exec_query_stats AS qs    →'sys.dm_exec_query_stats' は無効です。 調べても何が悪いのかわからず困っています。 何がいけないのかご教授いただけませんでしょうか。 よろしくお願い致します。

  • SQL パラメーターの表示について

    度々お世話になります Windows7、VB2010(Windowsフォーム)、SQL Server で開発し、XPと7で画面を動かします 今、SQLでパラメータを使っており、エラー処理で困っております SQLのパラメータの内容が表示されない(SQLが、「~~~~ WHERE KEN_ID = @KEN_ID」そのままになり、「~~~~  KEN_ID = '01'」等にならない) です Dim sql As New StringBuilder Dim ds As DataSet Using con As New Common.DB(Common.Values.ConnectionString) Try sql.Append("SELECT KEN_NAM FROM KEN_M") sql.Append(" WHERE") sql.Append(" KEN_ID = @KEN_ID") con.ClearParameter() con.AddParameter("KEN_ID", strKenName) ds = con.GetDataSet(sql.ToString) Return dt Catch ex As Exception 'Throw New Exception(ex.ToString & vbCrLf & sql.ToString) MsgBox("県取得処理" & vbcrlf & Sql.Tostring) End Try End Using ---- ↓ 別プロジェクト ↓ --- Public Function GetDataSet(ByVal sql As String) As DataSet      Command.CommandText = sql      If String.IsNullOrEmpty(Command.CommandText) Then     Throw New Exception("SQLが指定されていません") End If Dim adapter As New SqlDataAdapter(Command) Try adapter.Fill(ds) Return ds Catch ex As Exception Throw New Exception("DataSetオブジェクトの取得に失敗しました。", ex) End Try と書いております よろしくお願いします

  • VBでSQL文のUPDATE文を使った時のエラー

    access VBA初心者ですが回答、ご指摘のほうよろしければお願いします。 フォームにて更新ボタン押下時、テーブルの更新日付を現在の日付で更新したいと考えております。 下記のようにVBを組み込んだのですが、実行すると「UPDATE ステートメントの構文エラーです」というエラーがでてしまいます。 構文のどこが悪いか御指南いただけないでしょうか。 test_TBLの更新日付のフィールドを現在日付で更新 Dim sql As String Dim newdate As Date newdate = Now() sql = "UPDATE test_TBL SET 更新日付 =#" & newdate & "#" DoCmd.RunSQL sql

  • string.h内でエラー

    Visual C++ 2005でプログラムを組んでいます。 あるプログラムをビルドすると以下のようにstring.h内でエラーが大量に発生します。string.hをインクルードしないとエラーは出ないことからおそらくstring.hまわりの設定がおかしいとは思うのですがよくわかりません。 エラー 2 error C2144: 構文エラー : 'char' は ')' によって先行されなければなりません。c:\program files\microsoft visual studio 8\vc\include\string.h 136 エラー 3 error C2144: 構文エラー : 'char' は ';' によって先行されなければなりません。c:\program files\microsoft visual studio 8\vc\include\string.h 136 エラー 5 error C2143: 構文エラー : ';' が ',' の前にありません。c:\program files \ microsoftvisualstudio8 \ vc\ include\ string.h 136 宜しくお願いします。

  • OSのヘルプでスクリプトエラー

    現在、Win2000 SP4でIE6なのですが、「スタート」→「ヘルプ」でOSのヘルプを開き、目次タグ内の任意のトピックを選択後、右側の表示されている説明の下部の「関連項目」をクリックすると「Internet Explorer スクリプトエラー」が表示されます。結局、目的の関連項目を見ることができない状況なのですが、どなたか原因がわかりますでしょうか? ちなみに、OSのヘルプに限らずoffice系(word、excel等)のヘルプでも同様のエラーが表示されます。また、IE5では正常に表示されていました。 また、修正プログラム「811630 : 重要な更新 (Windows 2000)」に関係があるかと思いましたが、すでにSP4で対応されているようでしたので原因が不明です。 以下、エラー時表示されるポップアップウィンドウの内容です。 ポップアップウィンドウタイトルのメッセージ 「Internet Explorer スクリプトエラー」 ウィンドウ内のメッセージ 「このページのスクリプトでエラーが発生しました。」 ライン:519 文字:9 エラー:オブジェクトでサポートされていないプロパティまたはメソッド です。 コード:0 URL:ms-its:C:\WINNT\Help\access.chm::/accessibility_overview.htm (URLはヘルプ項目によって任意)

  • SQL-SELECT文でのソート

    VB2010とmdb(Ms-Access)にてシステムを構築しています。 Select文にて取得したレコードをDatagridviewにて表示しようとしているのですが SQL="SELECT * FROM table ORDER BY ID" 当のシンプルなものだと表示できるのですが 特定の文字列順にソートしたくCASE WHENを使用して SQL = "SELECT * FROM table ORDER BY CASE BUPPIN WHEN '○○' THEN 1 WHEN '△△' THEN 2 ELSE 0 END" のようにSQLを書いてみたのですがデータアタプタにてデータテーブルに結果を入力させる際にエラーが出てしまいます。 構文間違いでしょうか? ご教授お願いします