作者 主題: VB.Net Reader.GetOrdinal  (閱讀 6083 次)

0 會員 與 1 訪客 正在閱讀本文。

snack.shih

  • 可愛的小學生
  • *
  • 文章數: 29
    • 檢視個人資料
VB.Net Reader.GetOrdinal
« 於: 2009-12-30 17:14 »
想請教高手大大,我以 SqlDataReader.GetOrdinal 抓取到資料庫的資料與TextBox比對,明明輸入對的帳號及密碼,但不知為何程式卻判斷我輸入的與資料庫裡的資料不同,想請教我哪裡寫錯了?

Public Class Login
    Dim sConn As SqlConnection
    Dim conn As String = "server=localhost;database=Product;uid=sa;pwd='123'"
    Dim FailCount As Integer = 0

    Private Sub CmdEnter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdEnter.Click
        Dim sConn = New SqlConnection(conn)
        sConn.Open()

        Dim SqlLogin As String
        Dim SqlReader As SqlDataReader
        Dim SqlLoginCmd As SqlCommand

        SqlLogin = "Select 帳號,密碼 From Login Where 帳號=帳號"
        SqlLoginCmd = New SqlCommand(SqlLogin, sConn)
        SqlLoginCmd.Parameters.AddWithValue("帳號", TxtID.Text)
        SqlReader = SqlLoginCmd.ExecuteReader()

        If SqlReader.Read() Then
            MsgBox(SqlReader.GetString(SqlReader.GetOrdinal("密碼")))
            If SqlReader.GetString(SqlReader.GetOrdinal("密碼")) = TxtPwd.Text Then
                TxtID.Text = SqlReader.GetString(SqlReader.GetOrdinal("帳號"))
                SqlReader.Close()
            Else
                FailCount += 1
            End If
        Else
            FailCount += 1
        End If

        If FailCount > 0 And FailCount <= 3 Then
            MsgBox("第" & FailCount.ToString & "次輸入錯誤", MsgBoxStyle.Exclamation, "系統訊息。")
            If FailCount >= 3 Then
                MsgBox("輸入錯誤次數已達三次,程式將自行關閉。", MsgBoxStyle.Exclamation, "系統訊息。")
                End
            End If
        End If
    End Sub
End Class

洋蔥叔叔

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 830
    • 檢視個人資料
    • 洋蔥叔叔的隨意漫談電腦、網路、.NET、軟體本地化、雜七雜八
回覆: VB.Net Reader.GetOrdinal
« 回覆 #1 於: 2009-12-30 17:59 »
參數前面多加個 @ 試試看:
代碼: [選擇]
        ...
        SqlLogin = "Select 帳號,密碼 From Login Where 帳號=@帳號"
        ...
        SqlLoginCmd.Parameters.AddWithValue("@帳號", TxtID.Text)
        ...

snack.shih

  • 可愛的小學生
  • *
  • 文章數: 29
    • 檢視個人資料
回覆: VB.Net Reader.GetOrdinal
« 回覆 #2 於: 2009-12-30 18:32 »
我在參數前面加了小老鼠,可是結果還是一樣不行。  :'(       
後來我把中間那段程式改成<>,居然就會過了...。但GetString + GetOrdinal 不就是為了要取出正確資料嗎?實際上取出的資料也是資料庫裡正確的資料啊!!
還是我把GetString + GetOrdinal 的用法搞錯了?  ???

            MsgBox(SqlReader.GetString(SqlReader.GetOrdinal("帳號")))  '取出正確帳號資料
            MsgBox(SqlReader.GetString(SqlReader.GetOrdinal("密碼")))  '取出正確密碼資料
 
            If TxtID.Text <> SqlReader.GetString(SqlReader.GetOrdinal("帳號")) Then
                If TxtPwd.Text <> SqlReader.GetString(SqlReader.GetOrdinal("密碼")) Then
                    SqlReader.Close()
                    MsgBox("登入成功。", MsgBoxStyle.Information, "系統訊息")
                End If
            Else
                FailCount += 1
            End If

洋蔥叔叔

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 830
    • 檢視個人資料
    • 洋蔥叔叔的隨意漫談電腦、網路、.NET、軟體本地化、雜七雜八
回覆: VB.Net Reader.GetOrdinal
« 回覆 #3 於: 2009-12-31 13:30 »
我在參數前面加了小老鼠,可是結果還是一樣不行。  :'(       
後來我把中間那段程式改成<>,居然就會過了...。但GetString + GetOrdinal 不就是為了要取出正確資料嗎?實際上取出的資料也是資料庫裡正確的資料啊!!
還是我把GetString + GetOrdinal 的用法搞錯了?  ???

            MsgBox(SqlReader.GetString(SqlReader.GetOrdinal("帳號")))  '取出正確帳號資料
            MsgBox(SqlReader.GetString(SqlReader.GetOrdinal("密碼")))  '取出正確密碼資料
 
            If TxtID.Text <> SqlReader.GetString(SqlReader.GetOrdinal("帳號")) Then
                If TxtPwd.Text <> SqlReader.GetString(SqlReader.GetOrdinal("密碼")) Then
                    SqlReader.Close()
                    MsgBox("登入成功。", MsgBoxStyle.Information, "系統訊息")
                End If
            Else
                FailCount += 1
            End If
嗯應該不是參數的問題,想太多了
你這樣還是錯吧, <> 是不等於,所以變成不管密碼是什麽都會成功
TxtID.Text 跟 TxtPwd.Text 也 MsgBox 用肉眼比對看看
還有除非你有設 Option Compare Text,要不然比對字串時大小寫有差

snack.shih

  • 可愛的小學生
  • *
  • 文章數: 29
    • 檢視個人資料
回覆: VB.Net Reader.GetOrdinal
« 回覆 #4 於: 2010-01-05 19:35 »
我試了兩、三天還是解決不了問題,結果我還是用了最簡單的Reader.Read去解決問題,不過還是很謝謝洋蔥叔叔的建議。  ;D