2016-10-25 5 views
0

接続されたデータソース/ MS Accessデータベースで動作する情報システムを開発中です。問題はちょっとしたことですが、私が遭遇した同様のものから適切な解決策を見つけることができないようです。OleDBで「構文エラーが発生しました」というメッセージが表示される

ここはボタンのコードです。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    'myConnection.ConnectionString = connString 
    'myConnection.Open() 
    If Me.txtConfirmPasscode.Text = Me.txtNewPasscode.Text Then 
     Dim updateCmd As OleDbCommand = New OleDbCommand("UPDATE Users SET Password = @ConfPasscode WHERE [Usernames] = @UsersID", myConnection) 
     Dim dr2 As OleDbDataReader = updateCmd.ExecuteReader 'SYNTEX ERROR IN UPDATE STATEMENT 

     With updateCmd.Parameters 
      updateCmd.Parameters.AddWithValue("@value", txtUserID.Text) 
      updateCmd.Parameters.AddWithValue("@firstname", txtConfirmPasscode.Text) 
     End With 

     updateCmd.ExecuteNonQuery() 

     Dim recFound As Boolean = False 
     Dim UserName As String = "" 

     While dr2.Read 
      recFound = True 
      UserName = dr2("Usernames").ToString 
     End While 

     If recFound = True Then 
      MessageBox.Show("Password changed successfully for " & UserName & ".", "Password Changed", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 

      'updateCmd.Parameters.Add(New OleDbParameter("Password", CType(txtConfirmPasscode.Text, String))) 
     Else 
      myConnection.Close() 
      Me.Refresh() 
     End If 
    Else 

    End If 

    Try 
     myConnection.Close() 
    Catch ex As Exception 
     MsgBox(ex.Message) 
    End Try 
End Sub 

私はこれらのコード行に達したとき、私は巨大なUPDATEステートメントの構文エラーを取得:

Dim updateCmd As OleDbCommand = New OleDbCommand("UPDATE Users SET Password = @ConfPasscode WHERE [Usernames] = @UsersID", myConnection) 
     Dim dr2 As OleDbDataReader = updateCmd.ExecuteReader 'I GET THE SYNTAX ERROR IN UPDATE STATEMENT ERROR HERE! 

私は過度のコードをフォーマットせずに機能するソリューションを得ることができることを願っています。私はまた、上記のコードでいくつかの他の問題を引き起こす可能性が私のコードの文法/構文の解決策を取得したいと思います

+0

'Password'は大括弧' [Password] 'が必要です – Bugs

+0

' try ... catch'をラップして例外をキャプチャしますか? SQLサーバーでも更新クエリを実行しようとしましたか? –

答えて

1

パスワードはms-accessの予約キーワードです。その周りに角括弧が必要ですが、別の問題があります。クエリを実行する前にパラメータを設定する必要があり、OLEDBいえアンドリューの以下のコメントに反応して

Dim updateCmd As OleDbCommand = New OleDbCommand("UPDATE Users 
    SET [Password] = @ConfPasscode 
    WHERE [Usernames] = @UsersID", myConnection) 
With updateCmd.Parameters 
    ' First ConfPasscode because is the first placeholder in the query 
    updateCmd.Parameters.AddWithValue("@ConfPasscode ", txtConfirmPasscode.Text) 
    ' Now UsersID as second parameter following the placeholder sequence 
    updateCmd.Parameters.AddWithValue("@UsersID", txtUserID.Text) 
End With 
Dim rowUpdated = updateCmd.ExecuteNonQuery 
.... 

を傷つけることはありませんあなたのプレースホルダと一致する名前を与え、名前ではなく位置によってパラメータを認識しません。 Morton、私はAddWithValueに起因する問題に言及する必要があります。この文脈では、文字列だけではパフォーマンス上の問題であり、他のコンテキスト(日付と小数点)では正しさの問題にエスカレートする可能性があります。

参照
Can we stop to use AddWithValue already?
How data access code affects database performance

別の答えで述べたようにまた、更新クエリに使用する正しい方法はは、ExecuteNonQueryですが、またのExecuteReaderは、あなたのテーブルを更新することができますが、それだけで必要なインフラストラクチャを構築するため、あなたが読んで何かを持っているときは、更新の効率が悪いです。いずれにしても、ExecuteNonQueryまたはExecuteReaderのみを使用してください。

+0

'AddWithValue'を使うことも問題を引き起こすかもしれません。 –

+0

@AndrewMortonはい、AddWithValueの問題への小さな参照を追加しました – Steve

+0

@ Steve。ありがとうございました。それはうまくいったけど、目標にしたいパスコードは変わらないようだ。 –

0

私はexecutereaderを使用してUPDATEコマンドを実行することに気付きました。更新後にレコードを返すことになります。クエリでは、更新クエリのみがトリガされます。おそらく、ストアドプロシージャに入れて、変更が加えられた後に更新されたレコードを選択してみてください。

関連する問題