Sql 高级搜索vb.net

Sql 高级搜索vb.net,sql,sql-server,vb.net,visual-studio,Sql,Sql Server,Vb.net,Visual Studio,我有一个高级搜索,它包含combobox1,combobox2,combobox3,我搜索了一种在数据库中进行搜索的方法。 如果我选择combobox1而没有选择combobox2和combobox3,如果我选择combobox2而没有选择combobox1和combobox3,在combobox3和select all combobox3中也一样,我没有找到解决方案,那么我是否需要为每种情况制作更多的SqlCommand?或者有一个简单的方法来实现这一点,我尝试使用SqlCommand Pu

我有一个高级搜索,它包含combobox1,combobox2,combobox3,我搜索了一种在数据库中进行搜索的方法。 如果我选择combobox1而没有选择combobox2和combobox3,如果我选择combobox2而没有选择combobox1和combobox3,在combobox3和select all 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)
但是,如果我没有选择另一个组合框,那么只有一个组合框不起作用

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语句。

这里有一种方法可以做到这一点,不需要更改太多代码,假设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

构建sql语句并添加参数,仅针对非o(或null)的值。使用存储过程,然后可以使用动态sql或从代码使用条件来构建sql;选择一个。另外,您应该使用语句包装您的命令,以便正确处理它们。如果我添加新的2组合框,第一个包含{All,0,1,2,3,4,5,6,7,8,9,10},第二个包含{All,Submitted,Approved,Rejected}如何将其添加到search@MichaelRaouf我看你已经从Zohar那里得到了答案,因为我们的答案基本相同。在我的版本中,您可以执行类似于
cmd.Parameters.Add(“status”,SqlDbType.varchar).Value=If(status='All',CObj(DBNull.Value),status)
如果我添加新的2组合框,第一个组合框包含{All,0,1,2,3,4,5,6,7,8,9,10},第二个组合框包含{All,Submitted,Approved,Rejected}如何将其添加到搜索相同的内容-只需将
0
替换为
All
-
和column=ISNULL(NULLIF(@parameter,'All'),column)