while循环只显示1项

 mobiledu2502853597 发布于 2023-02-09 13:13

我正在使用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

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

1 个回答
  • 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
    

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

    2023-02-09 13:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有