while循环只显示1项

use*_*468 0 vb.net visual-studio-2010 visual-studio

我正在使用while循环根据第一个组合框选择的值填充第二个组合.然而,正在发生的是,循环只在第二个组合框中显示1个项目,而不是大约20个.如果我在while循环上设置断点,我可以看到所有项目都在计算但只是没有出现在组合框中.

如果有人能指出我的基本新手错误,我将不胜感激.非常感谢

Private Sub cmbCustomer_SelectedIndexChanged(ByVal sender As System.Object, _
                                             ByVal e As System.EventArgs) _
    Handles cmbCustomer.SelectedIndexChanged

    sql = "SELECT * from Departments WHERE Customer = '" & cmbCustomer.Text & "'"

    Dim cmd As New OleDb.OleDbCommand

    cmd.CommandText = sql
    cmd.Connection = oledbCnn
    dr = cmd.ExecuteReader

    While dr.Read()
        If (dr.HasRows) Then
            cmbDept.Text = CStr((dr("Name"))) <--- 2nd combobox
        End If
    End While

    cmd.Dispose()
    dr.Close()
End Sub
Run Code Online (Sandbox Code Playgroud)

Oli*_*bes 5

Text组合框的属性仅包含为所选项目显示的内容.您需要将项添加到Items集合中:

cmbDept.Items.Add(CStr(dr("Name")))
Run Code Online (Sandbox Code Playgroud)

组合框,列表框等通过调用其ToString()方法来显示项目.因此,CStr甚至不需要打电话:

cmbDept.Items.Add(dr("Name"))
Run Code Online (Sandbox Code Playgroud)

您通过连接字符串在SQL语句中插入值.如果你只是为自己使用你的程序,这是可以的; 然而,在生产环境中,这是危险的.有人可以输入一个终止SELECT语句的值,并引入另一个恶意语句.例如删除整个表的DELETE语句.这称为SQL注入攻击.

有两种方法可以解决这个问题:

1)逃离字符串:

    sql = "SELECT * FROM Dep WHERE Cust = '" & s.Replace("'", "''") & "'"
Run Code Online (Sandbox Code Playgroud)

2)使用命令参数:

    sql = "SELECT * from Departments WHERE Customer = ?"
    Dim cmd As New OleDbCommand(sql, oledbCnn)
    cmd.Parameters.AddWithValue("@p1", cmbCustomer.Text)
Run Code Online (Sandbox Code Playgroud)

如果您要插入日期,这也有一个优点,您不需要打扰日期格式.


您可以简化循环:

While dr.Read()
    cmbDept.Text = CStr(dr("Name")) 
End While
Run Code Online (Sandbox Code Playgroud)

没有必要进行测试,HasRows因为如果没有行可用dr.Read()则会返回False.


您可以Dispose使用以下Using语句自动调用VB :

Using cmd As New OleDbCommand(sql, oledbCnn)
    'TODO: Work with cmd here.
End Using
Run Code Online (Sandbox Code Playgroud)

DisposeUsing即使Using块内发生错误或者Using块被Return另一个语句留下,也将在块的末尾调用.