【问题标题】:Advanced Search vb.net高级搜索 vb.net
【发布时间】:2017-01-02 13:00:02
【问题描述】:

我有高级搜索包含 combobox1,combobox2,combobox3 我搜索了一种在数据库中进行搜索的方法。 如果我选择 combobox1 而没有选择 combobox2 和 combobox3 并且如果我选择 combobox2 而不是选择 combobox1 和 combobox3 在 combobox3 和选择所有组合框中我没有找到解决方案,我是否需要为每种情况制作超过 SqlCommand ?或者有一种简单的方法可以做到这一点我尝试制作 SqlCommand

 Public Sub Load_Main(ByVal projectid As Integer, ByVal pdocid As Integer, ByVal depid As Integer)
    main_Datatable.Clear()
    Dim cmd As New SqlCommand("select * from main where projectid=@projectid and pdocid=@pdocid and depid=@depid", DBConnection)

    cmd.Parameters.Add("projectid", SqlDbType.Int).Value = projectid
    cmd.Parameters.Add("pdocid", SqlDbType.Int).Value = pdocid
    cmd.Parameters.Add("depid", SqlDbType.Int).Value = depid
    DBConnection.Open()
    main_Datatable.Load(cmd.ExecuteReader)
    DBConnection.Close()
    cmd = Nothing

End Sub

Load_Main(project_combo.SelectedValue, doc_combo.SelectedValue, Depart_combo.SelectedValue)

但是如果我没有选择另一个组合框,它就不起作用

【问题讨论】:

  • 构建您的 sql 语句并添加参数,仅适用于非 o(或 null)的值。
  • 使用存储过程然后你可以使用动态sql或者从代码中使用if条件来构建你的sql;选择一个。
  • 另外,您应该将命令包装在 using 语句中,以便正确处理它们。

标签: sql sql-server vb.net visual-studio


【解决方案1】:

这是一种方法,无需更改太多代码,假设 0 值表示组合框中没有选择任何内容:

Public Sub Load_Main(ByVal projectid As Integer, ByVal pdocid As Integer, ByVal depid As Integer)
    main_Datatable.Clear()
    Dim query as string
    query = "select * " & _
            "from main " & _
            "where projectid = ISNULL(NULLIF(@projectid, 0), projectid) " & _
            "and pdocid = ISNULL(NULLIF(@pdocid, 0), pdocid) " & _
            "and depid = ISNULL(NULLIF(@depid, 0), depid) "
    Dim cmd As New SqlCommand(query, DBConnection)

    cmd.Parameters.Add("projectid", SqlDbType.Int).Value = projectid
    cmd.Parameters.Add("pdocid", SqlDbType.Int).Value = pdocid
    cmd.Parameters.Add("depid", SqlDbType.Int).Value = depid
    DBConnection.Open()
    main_Datatable.Load(cmd.ExecuteReader)
    DBConnection.Close()
    cmd = Nothing

End Sub

【讨论】:

  • 如果我添加新的 2 个组合框,第一个包含 {All,0,1,2,3,4,5,6,7,8,9,10},第二个包含 {All ,Submitted,Approved,Rejected}如何添加到搜索中
  • 同样的事情 - 只需将 0 替换为 All - and column = ISNULL(NULLIF(@parameter, 'All'), column)
【解决方案2】:
Public Sub Load_Main(ByVal projectid As Integer, ByVal pdocid As Integer, ByVal depid As Integer)
    main_Datatable.Clear()
    Dim cmd As New SqlCommand("select * from main where (@projectid IS NULL OR projectid=@projectid) and (@pdocid IS NULL OR pdocid=@pdocid) and (@depid IS NULL OR depid=@depid)", DBConnection)

    cmd.Parameters.Add("projectid", SqlDbType.Int).Value = If(projectid = 0, CObj(DBNull.Value), projectid)
    cmd.Parameters.Add("pdocid", SqlDbType.Int).Value = If(pdocid = 0, CObj(DBNull.Value), pdocid)
    cmd.Parameters.Add("depid", SqlDbType.Int).Value = If(depid = 0, CObj(DBNull.Value), depid)
    DBConnection.Open()
    main_Datatable.Load(cmd.ExecuteReader)
    DBConnection.Close()
    cmd = Nothing

End Sub

如果您将参数设置为 null,那么它实际上会被忽略,因为它匹配每条记录。由于您的值是作为整数传入的,因此如果您希望在 SQL 子句中忽略它,请将其设置为 0(或其他永远不会使用的整数值,如 -1)。

你应该改用 Using 语句。

【讨论】:

  • 如果我添加新的 2 个组合框,第一个包含 {All,0,1,2,3,4,5,6,7,8,9,10},第二个包含 {All ,Submitted,Approved,Rejected}如何添加到搜索中
  • @MichaelRaouf 我看到您已经从 Zohar 那里得到了答案,因为我们的答案基本相同。在我的版本中,你会做类似cmd.Parameters.Add("status", SqlDbType.varchar).Value = If(status = 'All', CObj(DBNull.Value), status)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2018-07-13
  • 2015-04-17
  • 2012-04-09
  • 2015-04-06
  • 2018-11-05
  • 1970-01-01
相关资源
最近更新 更多