Suche in MySQL DB

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von M-Arens.

    Suche in MySQL DB

    Hallo zusammen,

    ich habe eine Funktion geschrieben mit der ich eine Suche in einer MySQL Tabelle ausführen möchte. Es wird auch etwas ausgeführt aber nicht das was ich möchte. Die SQL-Syntax schein auch richtig zu sein, da ich ja keinen Fehler bekomme.
    Ich möchte gerne das in der ganzen Tabelle nach dem was in der Variable Suchbegriff steht suchen. Damit auch Sachen gefunden werden, die mitten im Wort stehen habe ich noch "*" vor und nach dem Suchbegriff geschrieben. Fakt ist aber das Ihrgend was anderes gesucht wird, ich aber nicht weiß was. Die Summe der Datensätze verringert sich auf jeden fall.

    Hier mal die Funktion:

    VB.NET-Quellcode

    1. Private Function suchen() As DataTable
    2. 'Variablen für die Suche
    3. Dim s_Suchbegriff As String
    4. Dim s_Kostenstelle As String
    5. Dim s_Herstellername As String
    6. Dim s_Kategorie As String
    7. Dim s_Abteilung As String
    8. 'Variablen Werte zuordnen
    9. If TextBox_Suchbegriff.Text = "" Then
    10. s_Suchbegriff = "*"
    11. Else
    12. s_Suchbegriff = "*" & TextBox_Suchbegriff.Text & "*"
    13. End If
    14. '***********************************************
    15. If ComboBox_Kostenstelle.Text = "" Then
    16. s_Kostenstelle = "*"
    17. Else
    18. s_Kostenstelle = "*" & ComboBox_Kostenstelle.Text & "*"
    19. End If
    20. '***********************************************
    21. If ComboBox_Herstellername.Text = "" Then
    22. s_Herstellername = "*"
    23. Else
    24. s_Herstellername = ComboBox_Herstellername.Text
    25. End If
    26. '***********************************************
    27. If ComboBox_Kategorie.Text = "" Then
    28. s_Kategorie = "*"
    29. Else
    30. s_Kategorie = ComboBox_Kategorie.Text
    31. End If
    32. '***********************************************
    33. If ComboBox_Abteilung.Text = "" Then
    34. s_Abteilung = "*"
    35. Else
    36. s_Abteilung = ComboBox_Abteilung.Text
    37. End If
    38. '#################################################################################
    39. Dim conn As MySqlConnection = verbinden()
    40. Dim myAdapter As New MySqlDataAdapter
    41. Dim SQLAbfrage As String = "SELECT Typ, Bezeichnung, Herstellerbestellnummer, Herstellername, Kategorie, Abteilung, Kostenstelle FROM " _
    42. & "" & sPraefix & "_artikel WHERE Typ or Bezeichnung='" + Replace(s_Suchbegriff, " ", "") + "'" _
    43. & "AND Kategorie='" + Replace(s_Kategorie, " ", "") + "' AND Abteilung='" + Replace(s_Abteilung, " ", "") + "'" _
    44. & "AND Herstellername='" + Replace(s_Herstellername, " ", "") + "' AND Kostenstelle='" & Replace(s_Kostenstelle, " ", "") & "'" _
    45. & "order by Bezeichnung"
    46. Dim myCommand As New MySqlCommand
    47. Dim myData As New DataTable
    48. myCommand.Connection = conn
    49. myCommand.CommandText = SQLAbfrage
    50. myData.Reset()
    51. myCommand.Connection = conn
    52. myCommand.CommandText = SQLAbfrage
    53. myAdapter.SelectCommand = myCommand
    54. myAdapter.Fill(myData)
    55. Return myData
    56. conn.Close()
    57. End Function


    Kann mir einer helfen wo der Fehler steckt?? Das was in den Variablen steht sollte stimmen. Als Beispiel steht in s_Suchbegriff "*taster*"
    Also ich würde dir raten den SQL Query so anzulegen, dass Felder die leer sind auch nicht im Query auftauchen.

    also z.B.

    VB.NET-Quellcode

    1. SQLWhere = ""
    2. If TextSuche1.Text = "" Then
    3. If NOT SQLWhere = "" Then SQLWhere &= " AND " ' Wenn schon etwas in der Variablen steht mit AND verknüpfen
    4. SQLWhere &= "Spalte = '" & TextSuche1.Text & "'"
    5. End If


    So hast du einen sauberen Query. die Variable SQLWhere fügst du dann später nur noch in den eigentlichen Query mit ein.
    Wenn du eine Volltext suche machen willst musst du nicht den = Operator verwenden sondern "Like"

    SQL-Abfrage

    1. SELECT * FROM Tabelle WHERE Spalte LIKE '%test%'


    die % zeichen heißt davor kann noch was stehen und auch dahinter. Wenn du nach 'test%' suchst wird alles gefunden was mit "test" anfängt und wenn nach '%test' suchst wird das gefunden, was micht "test" aufhört. Denke mal das System ist klar oder?

    Edit: Zudem wird in der Where bei dir Type Or Bezeichnung nicht funktionieren, weil hierbei gesucht wird wo Typ nichts ist, weil nicht angegeben.
    Du kannst ja auch nicht in VB eine Bedingung so verknüpfen

    VB.NET-Quellcode

    1. If Variable1 Or Variable2 = "dies" Then


    sondern musst es explizit angeben

    VB.NET-Quellcode

    1. If Variable1 = "dies" Or Variable2 = "dies" Then


    Also denn typ oder Bezeichnung das gleiche sein kann musst es auch so angeben

    SQL-Abfrage

    1. Where Typ = '" & TextBezeichnung.Text & '" OR Bezeichnung = '" & TextBezeichnung.Text & '"
    @M-Arens
    SQLWhere ist eine Variable die genutzt wird um die Filterbedingungen variable zu halten, damit man diese bei Bedarf so setzen kann, wie benötigt. Die Varibale wird dann im WHERE-Teil des SQL-Befehl eingesetzt.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Also wenn ich das jetzt mit dem SQLWhere mache, ich denke das ich das verstanden habe.


    Wie kann ich das dann in meinem SQL Query mit dem Like verbinden? Ich brauche die Volltextsuche bei dem Suchfeld und der Combo_Kostenstelle?


    SQL-Abfrage

    1. SELECT * FROM Tabelle WHERE " & SQLWhere & " LIKE '%test%'
    ???
    Nein, du musst das bei jeder Abfrage machen SQLWhere ist nur eine Sammlung von Bedingungen.

    VB.NET-Quellcode

    1. SQLWhere = ""
    2. If TextSuche1.Text = "" Then
    3. If NOT SQLWhere = "" Then SQLWhere &= " AND " ' Wenn schon etwas in der Variablen steht mit AND verknüpfen
    4. SQLWhere &= "Spalte LIKE '%" & TextSuche1.Text & "%'"
    5. End If