2017-03-31 7 views
0

Access 2016データベースを簡単に更新しようとしています。私はVisual Studio/VB.netを使用しています。私は同じタイプのコーディングを使用して別のフォームでこれを行うことができました(それはかなり基本的ですが、それは学校プロジェクトのためでしたが、これ以上はありませんでした)。私はこれを行うには、2つの異なる方法を試してみました...例えば、更新テーブルアダプタを使用して:Visual Studio 2015を使用してAccessデータベースを更新する - VB.net

  MediatorsListTableAdapter.UpdateMediators(MediatorIDTextBox.Text, MediatorNameTextBox.Text, MaskedTextBox1.Text, MaskedTextBox2.Text, DateTimePicker1.Value, 
      AvailabilityTextBox.Text, EmailTextBox.Text) 

私は、アダプタの同様のタイプを使用しているにもかかわらず、私はいつもnotImplemented例外がスローされます、そのメソッドを使用して他の場所。

saveInfo = "UPDATE mediatorsList(mediatorName, email, mediatorPrimaryPhone, mediatorSecondaryPhone, lastMediationDate, availability) 
       VALUES('" & MediatorNameTextBox.Text & "','" & EmailTextBox.Text & "','" & MaskedTextBox1.Text & "','" & MaskedTextBox2.Text & "', 
      '" & DateTimePicker1.Value & "','" & AvailabilityTextBox.Text & "', WHERE mediatorID = '" & MediatorIDTextBox.Text & "') " 

しかし、この方法は私にUPDATE文で 構文エラーのエラーを与える:また、私は(理想的な、私は知りません)神経質メソッドを使用してみました。もう一度このメソッドを問題なく使用しました。以下では、このフォームのすべてのコードを掲載します。

Imports System.Data 
Imports System.Data.Odbc ' Import ODBC class 
Imports System.Data.OleDb 
Imports System.Data.SqlClient 

Public Class editMediators 

Dim NewData As Boolean 
Dim objConnection As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\ECRDatabase.accdb") 


' create functions for save or update 
Private Sub runAccessSQL(ByVal sql As String) 
    Dim cmd As New OleDbCommand 
    connect() ' open our connection 
    Try 
     cmd.Connection = conn 
     cmd.CommandType = CommandType.Text 
     cmd.CommandText = sql 
     cmd.ExecuteNonQuery() 
     cmd.Dispose() 
     conn.Close() 
     MsgBox("Data Has Been Saved !", vbInformation) 
    Catch ex As Exception 
     MsgBox("Error when saving data: " & ex.Message) 
    End Try 
End Sub 

Private Sub editMediators_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    Me.MediatorsListTableAdapter.Fill(Me.ECRDatabaseDataSet.mediatorsList) 'loads current mediator information 
    DateTimePicker1.Value = Today() 

End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 'update button 
    NewData = True 
    alertMsgBox2() 

End Sub 

Private Sub alertMsgBox2() 

    Select Case MsgBox("Yes: Saves Changes," & vbNewLine & 
      "No: Exits the mediator update window without saving," & vbNewLine & 
      "Cancel: Returns to the mediator update window.", MsgBoxStyle.YesNoCancel, "Update Mediator Information") 
     Case MsgBoxResult.Yes 

      MediatorsListBindingSource.EndEdit() 
      updateMediator() 

     'intentionally commented out     
     'MediatorsListTableAdapter.UpdateMediators(MediatorIDTextBox.Text, MediatorNameTextBox.Text, MaskedTextBox1.Text, MaskedTextBox2.Text, DateTimePicker1.Value, 
      'AvailabilityTextBox.Text, EmailTextBox.Text) 

      ' Me.Close() 

     Case MsgBoxResult.No 
      MediatorsListBindingSource.CancelEdit() 
      Me.Close() 
    End Select 

End Sub 

Private Sub updateMediator() 
    Dim saveInfo As String 
    If NewData Then 
     Dim Message = MsgBox("Are you sure you want to update mediator information? ", vbYesNo + vbInformation, "Information") 
     If Message = vbNo Then 
      Exit Sub 
     End If 
     Try 
      'Update mediator information 
      saveInfo = "UPDATE mediatorsList(mediatorName, email, mediatorPrimaryPhone, mediatorSecondaryPhone, lastMediationDate, availability) 
       VALUES('" & MediatorNameTextBox.Text & "','" & EmailTextBox.Text & "','" & MaskedTextBox1.Text & "','" & MaskedTextBox2.Text & "', 
      '" & DateTimePicker1.Value & "','" & AvailabilityTextBox.Text & "', WHERE mediatorID = '" & MediatorIDTextBox.Text & "') " 
     Catch ex As Exception 
     End Try 

    Else 
     Exit Sub 

    End If 
    runAccessSQL(saveInfo) 

End Sub 

コードから抜けているかどうかわかりませんが、明らかに何かがありません。自分のデータベースフィールドをチェックして文字列/テキストフィールドに設定して、それを動作させることができるかどうかを確認しました。一度に、間違ったデータ型に設定された2つの電話番号フィールドが2つあったので、int32要件ごとに番号を入力するだけでした。私は実際にこれらのメソッドの1つを数ヶ月前にdbを更新/更新していましたが、その後何が起こったのか分かりません。私はVisual Studioが私におそらく貢献したいくつかの問題を教えてくれたことを知っていますが、何が起こったのか覚えておくには長すぎます。

私はむしろ何か別の方法で動作するように思えるようにしようとすると失われています。どんなアイデアを見て、そして/または試してみるか?うまくいけば私は正しい方向に向けることができます。

感謝:)あなたの更新ステートメントが正しくない

+1

さて、 'UPDATE'文は何が実行されていますか?明らかに構文エラーがあります。このコードはSQLインジェクションにも広く使われているので、ユーザーがあなたに送る値は何であれ、コードとして*盲目的に*実行していることに注意してください。これらの値の1つ以上が無効な構文であるようです。 (これらの値のどれもが悪意のある*であってもうまくいきません。これに対処するために、パラメータ化されたクエリを見てみたいでしょう) – David

答えて

0

、WHERE句は、VALUES()セグメント内であり、それの後でなければなりません。

は、代わりにこれを試してみてください: (編集後)

saveInfo = "UPDATE mediatorsList SET mediatorName='" & _ 
    MediatorNameTextBox.Text & "', email='" & EmailTextBox.Text & "', .... WHERE " & _ 
    mediatorID = '" & MediatorIDTextBox.Text & "'" 

も正しく日付を処理するようにしてください。私は通常、yyyy/mmm/dd形式で書式設定を強制します。

+1

それは 'UPDATE mediatorsListでなければならないでしょうか?mediatorName = ... WHERE ... '(また、上記のコメントに記載されているようにパラメータ化する必要があります)? – Mark

+0

PLUS余分なコンマの前にWHERE – peterG

+0

PLUS日付をテキストに変換する – Plutonix

関連する問題