2017-01-02 5 views
0

Ich habe erweiterte Suche nach das enthält combobox1, combobox2, combobox3 Ich suchte nach einer Möglichkeit, Suche in der Datenbank zu machen. Wenn ich combobox1 auswähle und nicht combobox2 und combobox3 auswähle und combobox2 und nicht combobox1 und combobox3 auch gleich in combobox3 auswähle und alle comboboxs auswähle habe ich keine Lösung gefunden, muss ich mehr als SqlCommand für jeden Fall machen? oder gibt es eine einfache Möglichkeit, dies zu tun, habe ich versucht, SqlCommandErweiterte Suche 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) 

zu machen, aber wenn ich nicht die anderen Combobox ausgewählt haben nur eine funktioniert nicht

+2

Erstellen Sie Ihre SQL-Anweisung, und fügen Sie Parameter nur für die Werte das sind nicht o (oder null). –

+0

Verwenden Sie eine gespeicherte Prozedur, dann können Sie dynamische SQL oder Code-Verwendung verwenden, wenn Bedingungen zum Erstellen Ihrer SQL; wähle eins. – Codexer

+1

Auch sollten Sie Ihre Befehle in Anweisungen verwenden, damit sie ordnungsgemäß entsorgt werden. – Codexer

Antwort

0

ist eine Möglichkeit, es zu tun, ohne zu viel Code zu ändern, vorausgesetzt, der Wert 0 bedeutet, wurde nichts in dem Kombinationsfeld ausgewählt:

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

Wenn ich neue 2 combobox die erste mit contain {All, 0,1,2,3,4,5,6,7,8,9,10} hinzufügen und die zweite enthält { All, Submitted, Approved, Rejected} Wie man es zur Suche hinzufügt –

+0

gleiche Sache - ersetzen Sie einfach die '0' mit' All' - 'und Spalte = ISNULL (NULLIF (@Parameter, 'Alle'), Spalte)' –

+0

Danke, das funktioniert mit mir –

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 

Wenn Sie einen Parametersatz dann auf null Es wird effektiv ignoriert, da es mit jedem Datensatz übereinstimmt. Da Ihre Werte als Ganzzahlen übergeben werden, setzen Sie sie auf 0 (oder einen anderen ganzzahligen Wert, der niemals wie -1 verwendet wird), wenn Sie möchten, dass er in Ihrer SQL-Klausel ignoriert wird.

Und Sie sollten stattdessen eine Using-Anweisung verwenden. Hier

+0

Wenn ich neue 2 Comboboxen addiere, enthält die erste mit contained {All, 0,1,2,3,4,5,6,7,8,9,10} und die zweite enthält {All, Submitted, Approved, Rejected} Wie man es zur Suche hinzufügt –

+0

@MichaelRaouf Ich sehe, Sie haben bereits eine Antwort von Zohar bekommen, da unsere Antworten im Wesentlichen identisch sind. In meiner Version würden Sie etwas tun wie 'cmd.Parameters.Add (" status ", SqlDbType.varchar) .Wert = If (status = 'All', CObj (DBNull.Value), status)' – topshot

+0

Danke, ich versuchte es, aber es funktioniert nicht mit mir –

Verwandte Themen