2014-07-23 49 views
0

當我點擊文本框上的有效ID號的按鈕2時,它始終顯示消息框「無效的ID號」但如果我刪除IF聲明,它顯示數據庫記錄,它工作正常,但我需要這個IF聲明,我認爲這裏的問題是dr.HasRows,但我不知道該怎麼把。VB.NET:無法讀取MySQL數據讀取器的數據庫記錄dr.HasRows

Imports MySql.Data.MySqlClient 

Public Class Form16 
    Private Sub Form16_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    End Sub 

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
     Dim con As New MySqlConnection("server=localhost;user id=root;password=root;database=db") 
     Dim DataSet1 As New DataSet 
     Dim dr As MySqlDataReader 
     Dim da As New MySqlDataAdapter 
     Dim cmd As New MySqlCommand 

     con.ConnectionString = "server = localhost; user id = root;password=root; database = db" 
     cmd.Connection = con 
     con.Open() 
     cmd.CommandText = "select * from voter where idn='" & TextBox1.Text & "'" 
     dr = cmd.ExecuteReader 
     con.Close() 
     da.SelectCommand = cmd 
     da.Fill(DataSet1, "db") 


     If dr.HasRows Then 
      Label2.DataBindings.Add("text", DataSet1, "db.fname") 
      Label10.DataBindings.Add("text", DataSet1, "db.mi") 
      Label11.DataBindings.Add("text", DataSet1, "db.lname") 
      Label12.DataBindings.Add("text", DataSet1, "db.yr") 
      Label13.DataBindings.Add("text", DataSet1, "db.sec") 
      Label14.DataBindings.Add("text", DataSet1, "db.vstatus") 
     Else 
      MessageBox.Show("Invalid ID No.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     End If 

     Label2.DataBindings.Clear() 
     Label10.DataBindings.Clear() 
     Label11.DataBindings.Clear() 
     Label12.DataBindings.Clear() 
     Label13.DataBindings.Clear() 
     Label14.DataBindings.Clear() 
    End Sub 
End Class 
+1

'選擇從選民那裏IDN = ' 「&TextBox1.Text&」''你是開放的SQL注入*。使用參數。除此之外,如果您仍然使用數據集,爲什麼還要使用數據庫?你可以通過這種方式訪問​​你填寫的表格:'Dim db As DataTable = DataSet1.Tables(「db」)',它是通過'db.Rows'的行。 –

+0

對不起,我只是一個初學者在vb.net,我真的不知道如何去做你所說的。你能解釋更多嗎? –

+0

是一個數字?如果是這樣刪除報價,以便你有... idn =「&TextBox1.Text ....如Tim提到你應該學會使用參數。 – Mych

回答

0

您需要使用Parameterized查詢,以防止SQL Injection

Dim commandText as String = "SELECT * FROM Voter WHERE [email protected]" 
Dim command As New MySqlCommand(commandText, connection) 

command.Parameters.AddWithValue("@idn", TextBox1.Text) 

你並不需要,如果你使用的是DataReader,因爲你可以使用DataSetDataAdapter轉換您的DataReaderDataTable

dr = command.ExecuteReader() ' Get Data Reader Rows 
dt.Load(dr) 'Convert DataReader into DataTable 

現在可以綁定到你的LabelTextBox

Label2.DataBindings.Add("Text", dt, "fname") 

您不必再使用HasRows屬性檢查是否有DataReader行,而不是你可以檢查你的DataTableRow Count

If (dt.Rows.Count > 0) Then 
    Label2.DataBindings.Add("Text", dt, "fname") 
End If 

我也使用Using聲明的dotNet專爲連接,這樣你就不必關閉:

Using connection As New MySqlConnection(connectionString) 
    'More code here 
End Using ' Close the connection automatically 

檢查完成下面的代碼:

Imports MySql.Data.MySqlClient 

Public Class Form16 

    Dim connectionString as String = "server = localhost; user id = root;password=root; database = db" 
    Dim dt as DataTable 

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 


    Using connection As New MySqlConnection(connectionString) 
     ' Use Parameterized query 
     Dim commandText as String = "SELECT * FROM Voter WHERE [email protected]" 
     Dim command As New MySqlCommand(commandText, connection) 
     Dim dr As MySqlDataReader 

     ' Add idn value using parameterized query 
     command.Parameters.AddWithValue("@idn", TextBox1.Text) 


     Try 
     connection.Open() ' Open Connection 
     dr = command.ExecuteReader() 
     dt = New DataTable() 
     dt.Load(dr) 
     If (dt.Rows.Count > 0) Then 
      Label2.DataBindings.Add("Text", dt, "fname") 
      Label10.DataBindings.Add("Text", dt, "mi") 
      Label11.DataBindings.Add("Text", dt, "lname") 
      Label12.DataBindings.Add("Text", dt, "yr") 
      Label13.DataBindings.Add("Text", dt, "sec") 
      Label14.DataBindings.Add("Text", dt, "vstatus") 
     Else 
      MessageBox.Show("Invalid ID No.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     End If 

     Catch ex As Exception 
     MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     End Try 
    End Using 

    End Sub 

End Class 
+0

wew!謝謝你的答案,先生!專門爲你教過的東西,我會學習所有的東西:D –

0

您已經完成了比您更多的工作......如果您要使用datareader,您的代碼最終應該看起來像這樣。 (我還沒有測試此代碼)

Imports MySql.Data.MySqlClient 

Public Class Form16 
    Private Sub Form16_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
End Sub 

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Dim con As New MySqlConnection("server=localhost;user id=root;password=root;database=db") 
    Dim DataSet1 As New DataSet 
    Dim dr As MySqlDataReader 
    Dim da As New MySqlDataAdapter 
    Dim cmd As New MySqlCommand 

    con.ConnectionString = "server = localhost; user id = root;password=root; database = db" 
    cmd.Connection = con 
    con.Open() 
    cmd.CommandText = "select * from voter where idn='" & TextBox1.Text & "'" 
    dr = cmd.ExecuteReader 
    con.Close() 


    if dr.read then 

     Label2.text = dr("fname") 
     Label10.text = dr("mi") 
     Label11.text = dr("lname") 
     Label12.text = dr("yr") 
     Label13.text = dr("sec") 
     Label14.text = dr("vstatus") 

    else 
     MessageBox.show("Invalid ID Number") 
    endif 

End Class