Một cái sai nhảm đến tức điên
Hôm nay mình đụng phải một đoạn code UPDATE dữ liệu vào Database MS Access. Khi chạy, nó không hề báo lỗi gì cả nhưng dữ liệu không được Update. Đau đầu, tốn nhiều thời gian cho nó một cách thật bực mình. Code em nó đây:
-
Public Function EditUser(ByVal curUsername As String, ByVal tPassword As String, ByVal tFullname As String, ByVal tGroupID As Integer) As Boolean
-
Dim tBool As Boolean = False
-
Try
-
Dim cmd As New OleDb.OleDbCommand("UPDATE tblUser SET " & _
-
"[Password]=@Password, Fullname=@Fullname, UserGroup_ID=@UserGroup_ID " & _
-
"WHERE Username=@Username", conn)
-
-
Dim Param As OleDbParameter
-
Param = cmd.Parameters.Add("@Username", OleDbType.VarChar, 50)
-
Param.Value = curUsername
-
Param = cmd.Parameters.Add("@Password", OleDbType.VarChar, 50)
-
Param.Value = tPassword
-
Param = cmd.Parameters.Add("@Fullname", OleDbType.VarChar, 128)
-
Param.Value = tFullname
-
Param = cmd.Parameters.Add("@UserGroup_ID", OleDbType.Integer)
-
Param.Value = tGroupID
-
-
OpenConn()
-
cmd.ExecuteNonQuery()
-
CloseConn()
-
tBool = True
-
Catch ex As Exception
-
MsgBox(ex.Message)
-
End Try
-
Return tBool
-
End Function
Với khi báo trước:
-
Public connStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data source='D:\WORKING\App\PN2 Product Manager\Database\PN2ProductManager.mdb';User Id=admin;Password=;"
-
Public conn As New OleDbConnection(connStr)
-
Public Sub OpenConn()
-
If conn.State = ConnectionState.Closed Then conn.Open()
-
End Sub
-
-
Public Sub CloseConn()
-
If conn.State = ConnectionState.Open Then conn.Close()
-
End Sub
Đã nghi ngờ là vấn đề nằm ở mệnh đề WHERE, nhưng kiểm tra hoài vẫn không thấy có gì bất hợp lý. Sau khi thử thay “WHERE Username=@Username” thành “WHERE Username=’” & curUsername & “‘” thì lại chạy ngon lành. Thật sự đến lúc này vẫn không hiểu lý do tại sao thế, và cũng không bằng lòng với cách giải quyết trên… nên bắt đầu mò mò vào Google. Nhiều người gặp tình trạng tương tự… nhưng chỉ có một số ít đã giải quyết. Vấn đề nằm ở chổ: Các cái tên @Username, @Password, … là vô dụng. Vì nó chỉ ráp vào theo thứ tự biến được Add. Tức là phải Add @Username sau cùng (do trong câu truy vấn nó ở sau cùng)… Đã thử tìm xem có cách nào mà không cần phải đưa đúng thứ tự như trên mà vẫn chạy được hay không, nhưng xem ra bó tay. Bên Oracle thì có cách set: cmd.BindByName=true (set cho nó hiểu tên biến). Đành phải theo thứ tự vậy (dù cực kỳ bất lợi và nhiều vấn đề phát sinh…)
Đây là code chạy được, ghi lại cho đỡ tức:
-
Public Function EditUser(ByVal curUsername As String, ByVal tPassword As String, ByVal tFullname As String, ByVal tGroupID As Integer) As Boolean
-
Dim tBool As Boolean = False
-
Try
-
Dim cmd As New OleDb.OleDbCommand("UPDATE tblUser SET " & _
-
"[Password]=@Password, Fullname=@Fullname, UserGroup_ID=@UserGroup_ID " & _
-
"WHERE Username=@Username", conn)
-
-
Dim Param As OleDbParameter
-
Param = cmd.Parameters.Add("@Password", OleDbType.VarChar, 50)
-
Param.Value = tPassword
-
Param = cmd.Parameters.Add("@Fullname", OleDbType.VarChar, 128)
-
Param.Value = tFullname
-
Param = cmd.Parameters.Add("@UserGroup_ID", OleDbType.Integer)
-
Param.Value = tGroupID
-
Param = cmd.Parameters.Add("@Username", OleDbType.VarChar, 50)
-
Param.Value = curUsername
-
-
OpenConn()
-
cmd.ExecuteNonQuery()
-
CloseConn()
-
tBool = True
-
Catch ex As Exception
-
MsgBox(ex.Message)
-
End Try
-
Return tBool
-
End Function
Hãy gởi vài lời phản hồi theo mẫu dưới đây