mysql Abfrage - leeres Ergbnis abfragen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    mysql Abfrage - leeres Ergbnis abfragen

    Hallo zusammen,

    ich mache mit folgendem Code eine einfach mysql Abfrage, welche auch funktioniert:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. con.ConnectionString = "Data Source=***;database=***;UID=***;pwd=***"
    2. cmd.Connection = con
    3. cmd.CommandText = "SELECT * from t_lag_inhalt WHERE Charge = '" & suchbegriff & "'"
    4. Try
    5. con.Open()
    6. reader = cmd.ExecuteReader()
    7. 'Abfrage starten
    8. Do While reader.Read()
    9. lbl_stellplatz.Text = CStr(reader("Stellplatz"))
    10. Loop
    11. 'Verbindung schließen
    12. reader.Close()
    13. con.Close()


    Wenn der Suchbegriff in der Datenbank allerdings nicht gefunden wird, liefert mysql ja in diesem Sinne keinen Fehler zurück sondern lediglich ein "leeres" Ergbenis. Wie kann ich das "abfangen" bzw. abfragen, damit ich in einem Infolabel dann zB ausgeben kann "der Suchbegriff wurde nicht gefunden"?!

    Danke für jeden Tipp! :thumbup:
    ==> seid .net zueinander :D <3 <==
    Eine Möglichkeit wäre es so zu machen :

    VB.NET-Quellcode

    1. reader = cmd.ExecuteReader()
    2. lbl_nichtgefunden.visible = True ' Einblenden des Labels
    3. 'Abfrage starten
    4. Do While reader.Read()
    5. ' Wenn ein Datensatz vorhanden wird es direkt wieder ausgeblendet
    6. lbl_nichtgefunden.visible = False
    7. lbl_stellplatz.Text = CStr(reader("Stellplatz"))
    8. Loop
    Also eine extra Funktion gibt es nicht. Es ist nur ein sehr kleines Tool mit dem nach einem Stellplatz gesucht wird anhand einer eingegebenen Suchnummer (Teilenummer). Wie gesagt geht auch alles super, wenn er einen Eintrag findet schreibt er eben auch den Stellplatz in das Label. Mehr "Funktionsumfang" brauche ich eigentlich auch nicht bis eben dass wenn er den Suchbegriff nicht findet, er ne Meldung ausgeben soll. Hier die ganze Sub:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub suche(ByVal suchbegriff As String)
    2. con.ConnectionString = "***"
    3. cmd.Connection = con
    4. cmd.CommandText = "SELECT * from t_lag_inhalt WHERE Charge = '" & suchbegriff & "'"
    5. Try
    6. con.Open()
    7. reader = cmd.ExecuteReader()
    8. 'Abfrage starten
    9. Do While reader.Read()
    10. lbl_stellplatz.Text = CStr(reader("Stellplatz"))
    11. Loop
    12. 'Verbindung schließen
    13. reader.Close()
    14. con.Close()
    15. 'Suchbegriff über Stellplatz anzeigen
    16. lbl_suchbegfriff.Text = suchbegriff
    17. Catch ex As Exception
    18. lbl_info.Text = (ex.Message)
    19. End Try
    20. End Sub


    @MrNobody: Ich frage mich generell, ob ich die Abfrage auf die DB per Loop laufen lassen muss?! Kann man dass nicht einmalig mache und sagen:
    - Abfrage auf die DB mit Suchbegriff
    - wenn Treffer, dann Ergebnis ausgeben
    - wenn Ergbenis leer oder negativ, Info ausgeben dass zum Suchbegriff nichts gefunden wurde
    ?!
    ==> seid .net zueinander :D <3 <==

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Axxxxxl“ ()

    Das ist ausgeschlossen, da der Suchbegriff von unserem Lagersystem nur eineindeutig und einmalig vergeben wird. Es gibt also nur "Das Teil ist im Lager auf Stellplatz xxx" oder "das Teil ist gar nicht im Lager".

    Aber ich habe es scheinbar gefunden:

    VB.NET-Quellcode

    1. 'Abfrage starten
    2. If (reader.HasRows) Then
    3. While reader.Read()
    4. lbl_stellplatz.Text = reader("Stellplatz").ToString
    5. End While
    6. Else
    7. lbl_info.Text = "Suchbegriff nicht gefunden!"
    8. End If
    ==> seid .net zueinander :D <3 <==

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Axxxxxl“ ()

    Mache deine Prozedur zu einer Funktion, die dir ein Ergebnis zurückgibt (bei Treffer den Fund sonst ""). Dieses Ergebnis verarbeitest du dann weiter...
    TryCatch-Zweig weglassen...
    Using-Blöcke verwenden...
    DB-Parameter verwenden...
    Reader.HasRows ist schon gut aber du suchst ja nach nur einen Inhalt und den willst du auslesen...

    VB.NET-Quellcode

    1. Dim Result As String = ""
    2. While reader.Read
    3. Result = reader("Stellplatz").ToString
    4. End While
    5. Return Result

    Vielleicht einmal nachdenken, wie man das ganze Projekt über ein typ. Dataset abhandeln könnte...
    Sorry, aber ich muss an das Theme gleich nochmal anknüpfen, damit ich nicht erst einen neuen Thread eröffne.

    Ich habe zur Darstellung meiner Ergebnisse nun ein Listview im Einsatz. Wenn die folgende Ausgabe der mySQL Abfrage...

    VB.NET-Quellcode

    1. 'Abfrage starten
    2. If (reader.HasRows) Then
    3. While reader.Read()
    4. 'Einträge ins Listview machen
    5. With listview
    6. .Items.Add(reader(suchart))
    7. .Items(0).SubItems.Add(reader("Stellplatz".ToString))
    8. End With
    9. End While


    ...die Ergebnisse findet (was es auch tut), erhält aber nur der erste Eintrag auch die zugehörige Info in der 2. Spalte des Listview, bei den anderen bleibt die 2. Spalte leer? Übersehe ich da was? Die erste Spalte wird einwandfrei mit Suchergebnissen gefüllt.
    ==> seid .net zueinander :D <3 <==

    VB.NET-Quellcode

    1. .Items(0).SubItems.Add(reader("Stellplatz".ToString))

    Mit >>items(0)<< wird immer auf die erste Zeile zugegriffen ...

    So ähnlich müsste es passen (nicht sicher ob count stimmt sonst ist es length :) )

    VB.NET-Quellcode

    1. .Items(.Items.count -1)


    Edit: Da war jemand schneller als ich :D