2012-04-15 48 views
1

我有一個程序,用戶可以通過在文本框中輸入舊密碼並在獨立的文本框中輸入新密碼來更新其密碼。cmd.executeNonQuery()更新

更新查詢然後用新密碼更新數據庫。

Try 
      If tbOldPassword.Text <> "" Then 
       For Each Row In ds.Tables("sqlAddNewDetails").Rows 
        If Row.Item(0) = gblstrUserID Then 
         If Row.Item(1) = tbOldPassword.Text Then 
          If tbPassword.Text = tbRePassword.Text Then 

           'Updates the database 
           sqlUpdate = ("UPDATE Users SET Password = '" & tbPassword.Text & "' WHERE userID = " & Row.Item(0)) 
           Dim cmd As New OleDbCommand(sqlUpdate, con) 
           cmd.ExecuteNonQuery() 
           MsgBox("Password successfully changed") 
          Else : MsgBox("The passwords are not the same") 
          End If 
         Else : MsgBox("Invalid old password") 
         End If 
        End If 
       Next 
      End If 
     Catch ex As Exception 
      MsgBox(ex.Message) 
     End Try 

然而,每次的代碼獲取到cmd.ExecuteNonQuery(),它拋出了一個錯誤,指出存在的更新查詢語法錯誤。但是,如果我在Microsoft Access中使用此查詢,它工作正常,以便更新查詢本身寫入正確。什麼可能是錯的?

注意:我在同一Sub例程內的另一段代碼中使用UPDATE查詢,它在那裏工作。它關於這個查詢的東西。

注意那句話:如果我改變更新查詢來更新用戶設置電子郵件= ' 「& tbPassword.Text &」' 其中userid = 「& Row.Item(0)」 它的工作原理。關於引發錯誤的密碼。

+0

你有什麼錯誤信息? – 2012-04-15 14:16:42

+0

UPDATE語句中的語法錯誤。 – 2012-04-15 14:19:08

回答

4

密碼是一個關鍵字,因此如以下方括號包裹它,

UPDATE Users SET [Password] =.....

+0

+1 OP的列表http://support.microsoft.com/kb/248738 – Fionnuala 2012-04-15 16:49:34

+0

+1這是正確的答案。但是,該代碼有點低效。 (沒有出口...)。更不用說如果密碼包含單引號... – Steve 2012-04-15 17:13:43

+0

完美。我懷疑這會是問題,但沒有真正想到。謝謝 – 2012-04-16 00:09:10

1

我必須看到錯誤味精,直到我注意到兩兩件事:

1 - con.Open()不存在!!!,它可能無法運行結束 2 - 在查詢,如果用戶ID是號碼,以便查詢字符串應該是: "' WHERE userID = " & CStr(Row.Item(0))

如果用戶ID是一個字符串查詢字符串應該是: "' WHERE userID = '" & Row.Item(0) & "'"

+0

我在上面的評論中指出了錯誤。我確實有con.Open(),但我沒有發佈它。用戶ID是自動編號,所以這不是問題。感謝您盡力幫助。 – 2012-04-15 14:23:00

+1

好了,然後轉換Row.Item(0)到字符串.... CStr(Row.Item(0)),因爲你不能附加一個字符串到int – 2012-04-15 14:24:11

+0

這沒有幫助。同樣的錯誤。 – 2012-04-15 14:26:32

1

我可能會檢查在執行發生之前查看sqlUpdate變量包含的內容。它很可能不包含你的想法。我會複製字符串值並將其粘貼到SQL Server Management Studio中,然後嘗試直接運行以驗證它。

話雖如此,我真的不會寫這個代碼使用字符串連接。你開放自己的SQL注入攻擊。如果用戶的密碼中有單引號,會發生什麼情況?使用SQL參數,而不是,是這樣的:

sqlUpdate = "UPDATE Users SET Password = ? WHERE userID = ?" 
cmd.Parameters.Add(tbPassword.Text) 
cmd.Parameters.Add(Row.Item(0)) 

嗯......我也可能不會使用的OleDb無論是。我會使用本地客戶端。

當然,我必須鏈接到經典XKCD Bobby Tables

+0

讓SQL注入與MS Access一起工作確實非常困難。 Access只會允許執行一條語句,所以所有常用的方法都不起作用。我可以理解,SQL注入需要通告,但只有在OP更改數據庫時纔會相關。 – Fionnuala 2012-04-15 16:51:59

+0

不是。僅僅因爲你僅限於一個聲明並不意味着沒有很多其他可用的攻擊。例如,如果他們正在更新密碼,我確定登錄代碼看起來非常相似:SELECT * FROM Users WHERE userID = 1 AND [Password] = xxx。注入如下內容變得非常簡單:'OR 1 = 1作爲密碼。現在您可以不用密碼登錄。第一個賬戶很可能是管理員賬戶。使用參數很容易避免這種情況,但不使用它們幾乎沒有意義。 – 2012-04-15 21:42:52