2013-07-29 3 views
0

VB.net 액세스 업데이트 쿼리에서 업데이트 쿼리 오류에 구문 오류가 발생했습니다. 내 쿼리는 다음과 같습니다 :VB.net 액세스 업데이트 쿼리

query = "UPDATE users SET username='" & newUsername & "', password='" & newPassword & "', department='" & newDepartment & "', display_name='" & newDisplayName & "', email='" & newEmail & "', extension='" & newExtension & "', access_level='" & newAccessLevel & "' WHERE id=" & usrID 

위의 변수 중 어떤 기호도 전혀 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

:: UPDATE :

UPDATE users SET username='alison', password='farm1234',department='1',display_name='Alison *****', email='[email protected]**********.com', extension='1012',access_level='50' WHERE id=1 

이 쿼리로 실행하는 것이다.

+0

가장 먼저 잘못하고있는 것은 SQL 주입 공격입니다. Google it ... 다음 코드는 실제로 코드를 실행 한 다음 변수 쿼리에 정확히 무엇이 있는지 알려줍니다. –

+0

회사가 약 15 개로 구성되어 있기 때문에 SQL 인젝션에 대해 걱정하지 않았습니다. 우리 집 사무실에있는 사람들, 이것에 대해 많이 알지 못하는 사람들. 나는 SELECT 쿼리를 위해 다른 시간에 prepared statement를 사용하고 있었지만, 이것은 더 빠르다. 게다가 준비된 명령문을 사용하여 먼저 로그인해야합니다. 위의 업데이트를 참조하십시오. –

+0

절대로, 지금까지 시스템을 누가 사용할 것인지 알고 있다고 가정하지 마십시오. 항상 코드를 안전하게 작성하십시오. 당신이 필요로하는 것은 관리자를 더 넓게하기로 결정하는 것이고 갑자기 근본적인 결함을 가진 소프트웨어의 Mission Critical 패키지를 가지고 있습니다. 오 - 매개 변수화 된 쿼리를 통해 로그인하는 것은 아무런 방어책이 아닙니다 ... 과거 로그인을 원한다고 가정합니까? 누군가 다른 사람이 친절하게/바보 같이 로그온 한 상태로 남아있는 기계로 테이블을 떨어 뜨릴 의도가 있다면 ... –

답변

2

오류는 예약 된 키워드 PASSWORD를 대괄호로 묶지 않고 사용함으로써 발생합니다.

Sql Injection 문제를 피하기 위해 항상 매개 변수화 된 쿼리뿐만 아니라 텍스트 값 (작은 따옴표 포함) 또는 십진수 값을 소수점 구분 기호 또는 날짜 값으로 구문 분석 할 때 구문 오류가 발생하지 않도록 항상 sql 명령을 빌드하는 데 문자열 연결을 사용하지 마십시오. .

그래서, 당신의 작업에 가능한 접근 방식은

query = "UPDATE users SET username=?, [password]=?, department=?, " & _ 
     "display_name=?, email=?, extension=?, access_level=?" & _ 
     " WHERE id=?" 

Using cmd = new OleDbCommand(query, connection) 
    cmd.Parameters.AddWithValue("@p1", newUsername) 
    cmd.Parameters.AddWithValue("@p2", newPassword) 
    cmd.Parameters.AddWithValue("@p3", newDepartment) 
    cmd.Parameters.AddWithValue("@p4", newDisplayName) 
    cmd.Parameters.AddWithValue("@p5", newEmail) 
    cmd.Parameters.AddWithValue("@p6", newExtension) 
    cmd.Parameters.AddWithValue("@p7", newAccessLevel) 
    cmd.Parameters.AddWithValue("@p8", usrID) 
    cmd.ExecuteNonQuery() 

End Using 

은은 OleDb가 SQL 명령 텍스트의 해당 자리를 찾기 위해 매개 변수 이름을 사용하지 않음을 명심 수 있습니다. 대신 위치 진행을 사용하므로 컬렉션에 매개 변수를 추가하면 SQL 명령 텍스트에 매개 변수가 나타나는 순서를 따라야합니다.

+0

위의 코멘트를 참조하십시오. 나는 다시 읽은 후에 제 코멘트가 적용되지 않는다고 생각합니다. 글쎄, 암호가 어쨌든 동봉되어야한다는 것을 알아야했습니다. –

0
ConStr() 
    Qry="UPDATE users SET [email protected], [password][email protected], [email protected], " & _ 
      "[email protected], [email protected], [email protected], [email protected]" & _ 
      " WHERE [email protected]" 
    cmd = new oledbcommand(Qry,Conn) 
    cmd.Parameters.AddWithValue("@uname",newUsername) 
    cmd.Parameters.AddWithValue("@pass",newPassword) 
    cmd.Parameters.AddWithValue("@dept",newDepartment) 
    cmd.Parameters.AddWithValue("@dnam",newDisplayName) 
    cmd.Parameters.AddWithValue("@email",newEmail) 
    cmd.Parameters.AddWithValue("@ext",newExtension) 
    cmd.Parameters.AddWithValue("@acslvl",newAccessLevel) 
    cmd.Parameters.AddWithValue("@id",usrID) 
    cmd.ExecuteNonQuery()