2016-10-25 5 views
0

연결된 데이터 소스/MS Access 데이터베이스와 작동하는 정보 시스템을 개발 중입니다. 문제는 다소 진부하지만 나는 내가 만난 비슷한 것들로부터 적절한 해결책을 찾지 못하는 것 같습니다.OleDB에서 "UPDATE 문에 구문 오류가 있습니다."

여기 내 버튼 코드입니다.

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 액세스의 예약 된 키워드입니다. 주위에 대괄호가 필요하지만 다른 문제가 있습니다. 당신은 쿼리를 실행하기 전에 매개 변수를 설정해야하고,은 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

@ 스티브. 고맙습니다. 그것은 효과가 있었지만 목표로하고 싶은 패스 코드는 변경되지 않은 것처럼 보입니다. –

0

executereader를 사용하여 UPDATE 명령을 실행했음을 확인합니다. 업데이트 후 레코드를 반환한다는 의미입니다. 쿼리에서 업데이트 쿼리 만 트리거합니다. 어쩌면 저장 프로 시저에 넣고 변경된 후에 업데이트 된 레코드를 선택하십시오.