2017-01-02 229 views
0

我有高級搜索,它包含combobox1,combobox2,combobox3我搜索的方式來進行數據庫搜索。 如果我選擇combobox1而不選擇combobox2和combobox3,如果我選擇combobox2而不選擇combobox1和combobox3也在combobox3中相同,並且在選擇所有組合框時我沒有找到解決方案,那麼是否需要爲每種情況製作比SqlCommand更多的?或者有一個簡單的方法來做到這一點,我試圖讓SqlCommand的高級搜索vb.net

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 [email protected] and [email protected] and [email protected]", 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) 

但是,如果我沒有選擇其他組合框只有一個那不行

+2

建立你的SQL語句,並添加參數,只爲值不是o(或null)。 –

+0

使用存儲過程,然後你可以使用動態sql或從代碼使用條件來構建你的sql;選一個。 – Codexer

+1

此外,你應該包裝你的命令使用語句,以便他們得到妥善處置。 – Codexer

回答

0

這裏是一個辦法做到這一點,而不會改變太多的代碼,假設一個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 
+0

如果我添加新的2組合框第一個包含{所有,0,1,2,3,4,5,6,7,8,9,10},第二個包含{所有,已提交,已批准,已拒絕}如何將其添加到搜索中 –

+0

同樣的事情 - 只用'All' - '和column = ISNULL(NULLIF(@parameter,'All')'列)替換'0'' –

+0

謝謝,這與我合作 –

0
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 [email protected]) and (@pdocid IS NULL OR [email protected]) and (@depid IS NULL OR [email protected])", 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

如果我添加新的2組合框,第一個包含{All,0,1,2,3,4,5,6,7,8,9,10},第二個包含{All,Submitted,Approved,Rejected}如何將它添加到搜索 –

+0

@MichaelRaouf我看到你已經從Zohar得到了答案,因爲我們的答案基本相同。在我的版本中,你可以做類似'cmd.Parameters.Add(「status」,SqlDbType.varchar).Value = If(status ='All',CObj(DBNull.Value),status)' – topshot

+0

謝謝,我嘗試它,但它不適用於我 –