【问题标题】:How to get dropdownlist value as number to SQL command in ASP如何在 ASP 中获取下拉列表值作为 SQL 命令的数字
【发布时间】:2019-12-16 00:19:00
【问题描述】:

我有一个下拉列表:

<asp:DropDownList ID="DropDownList1" runat="server">
        <asp:ListItem>10</asp:ListItem>
        <asp:ListItem>30</asp:ListItem>
        <asp:ListItem Value="100000">All</asp:ListItem>

后面的代码是:

Private Sub BindAllEmployee()
    Dim CS As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
    Dim sNumber As String = DropDownList1.SelectedValue
    Dim iNumber As Integer = Convert.ToInt32(sNumber)
    Using con As SqlConnection = New SqlConnection(CS)

        Using cmd As SqlCommand = New SqlCommand("SELECT TOP '" + iNumber + "' [EmployeeID], [EmployeeCode], [EmployeeName], [Position], [HireDate] FROM [Employee] ORDER BY [EmployeeID] DESC", con)

            Using sda As SqlDataAdapter = New SqlDataAdapter(cmd)
                Dim dte As DataTable = New DataTable()
                sda.Fill(dte)
                GridView1.DataSource = dte
                GridView1.DataBind()
            End Using
        End Using
    End Using
End Sub

我遇到了一个错误:

从字符串“SELECT TOP '”到类型“Double”的转换无效

【问题讨论】:

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


    【解决方案1】:

    不应引用 TOP 的参数。所以你可以试试

    "SELECT TOP " + iNumber + " [EmployeeID] ...
    

    相反。

    但实际上也不需要将sNumber 转换为整数,因为当您将它包含在 SqlCommand 中时,它只需要再次转换回字符串(因为 SQL 命令文本是一个大字符串)。

    其实

    "SELECT TOP " + sNumber + " [EmployeeID] ... 
    

    会更有意义。

    所以这是我认为效果更好的最终版本:

    Private Sub BindAllEmployee()
        Dim CS As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        Dim sNumber As String = DropDownList1.SelectedValue
    
        Using con As SqlConnection = New SqlConnection(CS)
            Dim sql as String = "SELECT TOP" + sNumber + " [EmployeeID], [EmployeeCode], [EmployeeName], [Position], [HireDate] FROM [Employee] ORDER BY [EmployeeID] DESC"
    
            Using cmd As SqlCommand = New SqlCommand(sql , con)
    
                Using sda As SqlDataAdapter = New SqlDataAdapter(cmd)
                    Dim dte As DataTable = New DataTable()
                    sda.Fill(dte)
                    GridView1.DataSource = dte
                    GridView1.DataBind()
                End Using
            End Using
        End Using
    End Sub
    

    【讨论】:

      【解决方案2】:

      更改查询字符串:

      New SqlCommand("SELECT TOP " + iNumber.ToString() + " [EmployeeID], [EmployeeCode], [EmployeeName], [Position], [HireDate] FROM [Employee] ORDER BY [EmployeeID] DESC", con)
      

      您必须将 iNumber 转换为字符串以将其连接起来并删除已建议的单引号。

      矿石直接使用sNumber

      New SqlCommand("SELECT TOP " + sNumber + " [EmployeeID], [EmployeeCode], [EmployeeName], [Position], [HireDate] FROM [Employee] ORDER BY [EmployeeID] DESC", con)
      

      【讨论】:

        【解决方案3】:

        似乎与用于连接的 + 符号有些混淆。我收到 Option Strict 的错误。编译器正在尝试将(算术添加)“SELECT TOP”添加到整数当我将 + 更改为和 & & 符号时,它是 vb.net 中的连接符号,该错误消失了。同时删除单引号。

        无需将下拉值更改为数字。它正在字符串中使用,因此要使用字符串连接,字符串是合适的。如果您使用字符串,编译器会将 + 符号解释为连接运算符,但最好始终使用 &。

        在 Using 块之外标注 DataTable。这样您就可以在连接关闭后使用它来填充网格。尽快关闭连接。

        Private Sub BindAllEmployee()
            Dim dte As DataTable = New DataTable()
            Dim CS As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
            Dim sNumber As String = DropDownList1.SelectedValue
            Using con As New SqlConnection(CS)
                Using cmd As New SqlCommand("SELECT TOP " & sNumber & " [EmployeeID], [EmployeeCode], [EmployeeName], [Position], [HireDate] FROM [Employee] ORDER BY [EmployeeID] DESC", con)
                    dte.Load(cmd.ExecuteReader)
                End Using
            End Using
            GridView1.DataSource = dte
            GridView1.DataBind()
        End Sub
        

        【讨论】:

          猜你喜欢
          • 2019-12-19
          • 2022-06-29
          • 1970-01-01
          • 1970-01-01
          • 2016-08-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多