2016-08-10 16 views
0

私が書いているプログラム(vb.net)は、テキストボックスの値をデータベースに読み込むことになっています。 しかし、「保存」をクリックすると、最初は何も起こりませんでした。エラーなし、通知なし、何もありません。だから私は、ブレークポイントを使用してそれをトレースし、それがになった:構文INSERT INTO文vb.netとアクセスデータベースのエラー

daTraining.Update(dsTraining, "Training") 

、ちょうど停止しました。 は、だから私は、try /キャッチに入れ、そして今私は私がこれを解決するか、問題が何であるかどのように困惑している

System.Data.OleDB.OledgException (0x80040E14): Syntax error in INSERT INTO statement. 

を取得し保存打ったとき。

コード

Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click 

     Try 
      Dim cb As New OleDb.OleDbCommandBuilder(daTraining) 
      Dim dsNewRow As DataRow 
      dsNewRow = dsTraining.Tables("Training").NewRow 
      dsNewRow.Item("ID") = txtTrainingID.Text 
      dsNewRow.Item("Ranch") = cbRanches.Text 
      dsNewRow.Item("Location") = txtLocation.Text 
      dsNewRow.Item("Date") = mtbDate.Text 
      dsNewRow.Item("StartTime") = mtbStartTime.Text 
      dsNewRow.Item("FinishTime") = mtbFinishTime.Text 
      dsNewRow.Item("Crew") = txtCrews.Text 
      dsNewRow.Item("Supervisor") = txtSupervisor.Text 
      dsNewRow.Item("Foreperson") = txtForeperson.Text 
      dsNewRow.Item("Activity") = txtActivity.Text 
      dsNewRow.Item("Trainer") = txtTrainer.Text 
      dsNewRow.Item("Topics") = txtTopics.Text 

      dsTraining.Tables("Training").Rows.Add(dsNewRow) 
      daTraining.Update(dsTraining, "Training") 

      MsgBox("Training Recorded") 

      cb.Dispose() 


     Catch ex As Exception 
      MsgBox(ex.ToString) 
     End Try 



    End Sub 
+0

'daTraining.InsertCommand.CommandText'にあるクエリを見てください。あなたは何らかの種類のエラーがあることがわかるはずです – FloatingKiwi

+0

[Microsoft Jet 4.0の予約語一覧](https://support.microsoft.com/en-us/kb/321266)。あなたのdataadapterは、コマンドビルダを繰り返し何度も作り直さなくても、すべてのコマンドを保持することができます。 – Plutonix

+0

@Plutonixが示唆するように、保存するたびに新しいコマンドビルダを作成すべきではありません。構築コマンドを作成するデータアダプタを作成した直後に、単一のコマンドビルダを作成します。データ・アダプターのメンバー変数を使用している場合は、コマンド・ビルダーにもメンバー変数を使用します。 – jmcilhinney

答えて

2

クエリでワイルドカードとコマンドビルダーでデータアダプタを使用したとき、これは一般的な問題です。 1つ以上のカラム名が予約語であるか、スペースやその他の特殊文字を含む場合、自動生成されたINSERT文とUPDATE文は構文エラーを生成します。

推奨される解決方法は問題の列名を変更することですが、オプションでない場合は、コマンドビルダのQuotePrefixおよびQuoteSuffixプロパティを設定して、生成されたアクションコマンドのすべての列名からエスケープします。適切な値はデータベースによって異なりますが、Microsoftデータベースの場合はそれぞれ["と"] "を使用してください。

0

コメントで示されているように、問題は、Dateが予約語であると

dsNewRow.Item("Date") = mtbDate.Text 

でした。

+0

いいえ、問題はありません。そのコードには何も問題はありません。問題は、コマンドビルダがその列名をエスケープしていないため無効なSQLを生成したことです。列名を変更せずにここに表示したコードを変更しないで修正するには、2つの方法があります。列名を変更するのが最善の選択肢ですが、問題が実際に問題なくあることを示していない限り、問題を修正できます。 – jmcilhinney

関連する問題