【问题标题】:Faster way to load drop down list加载下拉列表的更快方法
【发布时间】:2018-09-11 23:51:29
【问题描述】:

所以我在 asp.net Web 表单站点中加载下拉列表时遇到问题。我正在从 SQL Server 数据库中提取记录。我将结果绑定到一个下拉列表。

我的问题源于我正在检索 21500 多行这一事实,这会导致长时间延迟,直到浏览器抛出一条消息,询问我是否要停止长时间执行的脚本。如果我等待的时间足够长,大约 2 分钟它会回来,但运行速度仍然很慢,需要很长时间才能向下滚动列表。

这是 SQL 调用的 VB 代码:

    Private Function GetCorInfo(field As String, tblname As String, Optional whereClause As String = "") As DataTable
    Dim sqlCmdTxt As String = "Select " & field & " From " & tblname
    Using conn As New SqlConnection(corConnection)
        Try
            conn.Open()
        Catch ex As Exception
            Master.message = "Unable to open SQL DB connection\nError: SQL101\nPlease contact the Help Desk for support.\n" & HttpUtility.JavaScriptStringEncode(ex.Message)
            jsa.alertmessage(passedPage, Master.message)
        End Try
        Using sqlCmd As New SqlCommand
            'Check for where clause
            If whereClause <> "" Then
                sqlCmdTxt = sqlCmdTxt & whereClause
                If whereClause.Substring(7, 6) = "cornum" Then
                    sqlCmd.Parameters.AddWithValue("@cornum", ddl2.SelectedItem.Text)
                End If
            End If
            If field = "cornum" Then
                sqlCmdTxt = sqlCmdTxt & " Order By " & field & " Desc"
            End If
            sqlCmd.CommandText = sqlCmdTxt
            sqlCmd.Connection = conn
            Using sqlDT As New DataTable()
                Using sqlDA As New SqlDataAdapter(sqlCmd)
                    Try
                        sqlDA.Fill(sqlDT)
                        Return sqlDT
                    Catch ex As Exception
                        conn.Close()
                        Master.message = "Unable to load list.\nError: SQL104\n" & HttpUtility.JavaScriptStringEncode(ex.Message)
                        jsa.alertmessage(passedPage, Master.message)
                        Return Nothing
                    End Try
                End Using
            End Using
        End Using
    End Using
End Function

然后,当返回数据表时,我使用以下代码将其绑定到下拉列表:

                If Not IsNothing(dt) Then
                'Set ddl
                With ddl
                    'Turn on ddl
                    .Visible = True
                    'Set Data Source
                    .DataSource = dt
                    'Set Text Field
                    .DataTextField = field1
                    'Set Value Field
                    .DataValueField = field1
                    'Set variable to field value
                    'Bind Data
                    .DataBind()
                    'Assign Variable
                    field = ddl.SelectedItem.Text
                    'Check for ddl match
                    If whereClause <> "" AndAlso ddl1.SelectedIndex = 3 AndAlso ddl.ID = "ddl3" Then
                        .Items.FindByValue(field).Selected = True
                    ElseIf whereClause <> "" AndAlso ddl1.SelectedIndex = 3 AndAlso ddl.ID = "ddl4" Then
                        .Items.Insert(0, New ListItem("Select", "0"))
                    Else
                        'Insert first choice
                        .Items.Insert(0, New ListItem("Select", "0"))
                    End If
                    'Set to index 0
                    .SelectedIndex = 0
                End With
                Return 1
            Else
                Return -1
            End If

两组代码都在函数中运行。

如何加快速度?我已经研究过使用 Session 和 View State,但如果我这样做,返回的记录数量会导致更大的减速。

有人有什么想法吗?

提前感谢您的帮助。

【问题讨论】:

  • 也许搜索而不是填充下拉列表。
  • 等等,这是一个有 21500 个选项可供选择的下拉菜单?人们应该浏览所有这些选项吗?这里的 UI 似乎有些奇怪......
  • 你可以使用自动完成来代替......
  • 这是企业所有当前客户的列表。不,他们不看,按起始字母并跳到该部分。自动完成是否还需要对完整列表进行验证?
  • 不要用 20k+ 项填充下拉列表。

标签: asp.net sql-server vb.net webforms


【解决方案1】:

所以我终于做到了。

放置一个文本框,供用户输入新客户名称的前几个字符。然后,我构建了一个 SQL 查询,它只返回与输入的字符匹配的记录。

速度更快,最多只有 35 条记录...

【讨论】:

  • 您需要阅读、理解并开始使用参数化查询。我的朋友 bobby tables 喜欢构建字符串并执行它们的代码。 bobby-tables.com
  • 这看起来像是一条评论。不是答案
  • Sean Lange,即使没有用户输入数据。所有选择都来自下拉列表。
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多