2012-09-30 24 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,它工作。 –