我正在使用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
Olivier Jaco.. 5
Text
组合框的属性仅包含为所选项目显示的内容.您需要将项添加到Items
集合中:
cmbDept.Items.Add(CStr(dr("Name")))
组合框,列表框等通过调用其ToString()
方法来显示项目.因此,CStr
甚至不需要打电话:
cmbDept.Items.Add(dr("Name"))
您通过连接字符串在SQL语句中插入值.如果你只是为自己使用你的程序,这是可以的; 然而,在生产环境中,这是危险的.有人可以输入一个终止SELECT语句的值,并引入另一个恶意语句.例如删除整个表的DELETE语句.这称为SQL注入攻击.
有两种方法可以解决这个问题:
1)逃离字符串:
sql = "SELECT * FROM Dep WHERE Cust = '" & s.Replace("'", "''") & "'"
2)使用命令参数:
sql = "SELECT * from Departments WHERE Customer = ?" Dim cmd As New OleDbCommand(sql, oledbCnn) cmd.Parameters.AddWithValue("@p1", cmbCustomer.Text)
如果您要插入日期,这也有一个优点,您不需要打扰日期格式.
您可以简化循环:
While dr.Read() cmbDept.Text = CStr(dr("Name")) End While
没有必要进行测试,HasRows
因为如果没有行可用dr.Read()
则会返回False
.
您可以Dispose
使用以下Using
语句自动调用VB :
Using cmd As New OleDbCommand(sql, oledbCnn) 'TODO: Work with cmd here. End Using
Dispose
Using
即使Using
块内发生错误或者Using
块被Return
另一个语句留下,也将在块的末尾调用.
Text
组合框的属性仅包含为所选项目显示的内容.您需要将项添加到Items
集合中:
cmbDept.Items.Add(CStr(dr("Name")))
组合框,列表框等通过调用其ToString()
方法来显示项目.因此,CStr
甚至不需要打电话:
cmbDept.Items.Add(dr("Name"))
您通过连接字符串在SQL语句中插入值.如果你只是为自己使用你的程序,这是可以的; 然而,在生产环境中,这是危险的.有人可以输入一个终止SELECT语句的值,并引入另一个恶意语句.例如删除整个表的DELETE语句.这称为SQL注入攻击.
有两种方法可以解决这个问题:
1)逃离字符串:
sql = "SELECT * FROM Dep WHERE Cust = '" & s.Replace("'", "''") & "'"
2)使用命令参数:
sql = "SELECT * from Departments WHERE Customer = ?" Dim cmd As New OleDbCommand(sql, oledbCnn) cmd.Parameters.AddWithValue("@p1", cmbCustomer.Text)
如果您要插入日期,这也有一个优点,您不需要打扰日期格式.
您可以简化循环:
While dr.Read() cmbDept.Text = CStr(dr("Name")) End While
没有必要进行测试,HasRows
因为如果没有行可用dr.Read()
则会返回False
.
您可以Dispose
使用以下Using
语句自动调用VB :
Using cmd As New OleDbCommand(sql, oledbCnn) 'TODO: Work with cmd here. End Using
Dispose
Using
即使Using
块内发生错误或者Using
块被Return
另一个语句留下,也将在块的末尾调用.