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)
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另一个语句留下,也将在块的末尾调用.
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |