2012-09-30 61 views
0

我相信你一切都好。我想知道我做錯了什麼,以及如何解決它。我的意圖與下面的代碼是查詢我的MySQL數據庫,並在ComboBox中顯示錶的一列。然後,當選擇ComboBox中的值時,我希望所有記錄都被填充到表單上的其他控件中(我將爲此部分創建一個單獨的問題)。組合框沒有填充MySQL查詢結果 - 我該如何解決它?

現在,查詢正在運行,但組合框未被填充。我究竟做錯了什麼?請幫忙,謝謝。

這裏是我的代碼:

Private Sub RetrieveMySQLdata() 

    Try 
     Dim dbConn As New MySqlConnection 
     Dim dbQuery As String = "" 
     Dim dbCmd As New MySqlCommand 
     Dim dbAdapter As New MySqlDataAdapter 
     Dim dbTable As New DataTable 
     If dbConn.State = ConnectionState.Closed Then 
      dbConn.ConnectionString = String.Format("Server={0};Port={1};Uid={2};Password={3};Database=accounting", FormLogin.ComboBoxServerIP.SelectedItem, My.Settings.DB_Port, My.Settings.DB_UserID, My.Settings.DB_Password) 
      dbConn.Open() 
     End If 

     dbQuery = "SELECT *" & _ 
        "FROM cc_master INNER JOIN customer ON customer.accountNumber = cc_master.customer_accountNumber " & _ 
        "WHERE customer.accountNumber = '" & TextBoxAccount.Text & "'" 
     With dbCmd 
      .CommandText = dbQuery 
      .Connection = dbConn 
     End With 
     With dbAdapter 
      .SelectCommand = dbCmd 
      .Fill(dbtable) 
     End With 
     Dim i As Integer 
     For i = 0 To dbTable.Rows.Count - 1 
      ComboBoxCard.ValueMember = "ccNumber" 

     Next 
    Catch ex As Exception 
     MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _ 
        vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.") 
    End Try 

End Sub 
+2

你做錯的第一件事是使用內聯SQL查詢。 – TLS

+0

以爲你提供的解決方案。但是,是的,你是對的。我這樣做是因爲我還沒有學到其他的方法 - 我仍然在學習。 –

+1

由於您仍在學習,您需要閱讀「SQL注入攻擊」以及如何防止/避免它們。這會給你關於不使用內聯SQL查詢的知識。 – TLS

回答

2

如果你想填充ComboBox?我看到的唯一互動是這裏:

For i = 0 To dbTable.Rows.Count - 1 
    ComboBoxCard.ValueMember = "ccNumber" 
Next 

我猜測沒有做你認爲它在做什麼。首先,您在循環中多次將ValueMember設置爲相同的值。聲明中沒有任何內容隨循環的每次迭代而改變,爲什麼要循環呢?

更具體地說,ValueMember實際上並不是任何一種顯示值。 It's used to indicate which field in the bound data should contain the value。當您爲缺失的控件提供DataSource時,會使用此選項。

我假設DataSource應該dbTable,所以你可能希望做這樣的事情:

ComboBoxCard.DataSource = dbTable 
ComboBoxCard.ValueMember = "ccNumber" 
ComboBoxCard.DisplayMember = "Some Other Field in the database" 

我不記得,如果你需要顯式調用.DataBind()後這些控制聲明,但我鏈接到的示例沒有這樣做,所以我會放棄它。

本質上講你試圖在你的代碼做的是通過結果循環,並將其添加到ComboBox。你不需要這樣做。 ComboBox能夠在內部執行此操作,只要您將其DataSource指向正在使用的數據集並告訴它需要在該集上使用哪些字段即可。這被稱爲data binding

+0

感謝大衛,對你的迴應表示友善。我沒有意識到ComboBox能夠處理循環通過記錄本身。 –

1

看起來你是不是設置爲DataSource ComboBox對象。而不是這樣的代碼:

Dim i As Integer 
For i = 0 To dbTable.Rows.Count - 1 
    ComboBoxCard.ValueMember = "ccNumber" 
Next 

使用這樣的代碼:

ComboBoxCard.DataSource = dbTable 
ComboBoxCard.ValueMember = "ccNumber" 
ComboBoxCard.DisplayMember = "(some other column if you want)" 
+0

謝謝TLS,它工作。 –