Đặt làm trang chủ     Ghi nhớ (bookmark)     RSS     Đăng ký     Đăng nhập ?>

PN2design ’s Blog

Internet is my life - Thủ thuật IT
Ngày 06 Tháng mười, 2008 bỡi admin

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:

  1.     Public Function EditUser(ByVal curUsername As String, ByVal tPassword As String, ByVal tFullname As String, ByVal tGroupID As Integer) As Boolean
  2.         Dim tBool As Boolean = False
  3.         Try
  4.             Dim cmd As New OleDb.OleDbCommand("UPDATE tblUser SET " & _
  5.             "[Password]=@Password, Fullname=@Fullname, UserGroup_ID=@UserGroup_ID " & _
  6.             "WHERE Username=@Username", conn)
  7.  
  8.             Dim Param As OleDbParameter
  9.             Param = cmd.Parameters.Add("@Username", OleDbType.VarChar, 50)
  10.             Param.Value = curUsername
  11.             Param = cmd.Parameters.Add("@Password", OleDbType.VarChar, 50)
  12.             Param.Value = tPassword
  13.             Param = cmd.Parameters.Add("@Fullname", OleDbType.VarChar, 128)
  14.             Param.Value = tFullname
  15.             Param = cmd.Parameters.Add("@UserGroup_ID", OleDbType.Integer)
  16.             Param.Value = tGroupID
  17.  
  18.             OpenConn()
  19.             cmd.ExecuteNonQuery()
  20.             CloseConn()
  21.             tBool = True
  22.         Catch ex As Exception
  23.             MsgBox(ex.Message)
  24.         End Try
  25.         Return tBool
  26.     End Function

Với khi báo trước:

  1. 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=;"
  2. Public conn As New OleDbConnection(connStr)
  3.     Public Sub OpenConn()
  4.         If conn.State = ConnectionState.Closed Then conn.Open()
  5.     End Sub
  6.  
  7.     Public Sub CloseConn()
  8.         If conn.State = ConnectionState.Open Then conn.Close()
  9.     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:

  1.     Public Function EditUser(ByVal curUsername As String, ByVal tPassword As String, ByVal tFullname As String, ByVal tGroupID As Integer) As Boolean
  2.         Dim tBool As Boolean = False
  3.         Try
  4.             Dim cmd As New OleDb.OleDbCommand("UPDATE tblUser SET " & _
  5.             "[Password]=@Password, Fullname=@Fullname, UserGroup_ID=@UserGroup_ID " & _
  6.             "WHERE Username=@Username", conn)
  7.  
  8.             Dim Param As OleDbParameter
  9.             Param = cmd.Parameters.Add("@Password", OleDbType.VarChar, 50)
  10.             Param.Value = tPassword
  11.             Param = cmd.Parameters.Add("@Fullname", OleDbType.VarChar, 128)
  12.             Param.Value = tFullname
  13.             Param = cmd.Parameters.Add("@UserGroup_ID", OleDbType.Integer)
  14.             Param.Value = tGroupID
  15.             Param = cmd.Parameters.Add("@Username", OleDbType.VarChar, 50)
  16.             Param.Value = curUsername
  17.  
  18.             OpenConn()
  19.             cmd.ExecuteNonQuery()
  20.             CloseConn()
  21.             tBool = True
  22.         Catch ex As Exception
  23.             MsgBox(ex.Message)
  24.         End Try
  25.         Return tBool
  26.     End Function

Hãy gởi vài lời phản hồi theo mẫu dưới đây

Nhập lại mã xác nhận này