Abfragen bzw. -Teile verbinden

  • VB.NET
  • .NET 5–6

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    Abfragen bzw. -Teile verbinden

    Die Frage führt mein vorheriges Thema eigentlich weiter:

    Es wird eine Abfrage in folgender Art genutzt:

    VB.NET-Quellcode

    1. Dim CSV_Abfrage = "SELECT ds_vertrag.*
    2. FROM ds_vertrag
    3. WHERE ds_vertrag_nr ='1'
    4. ORDER BY ds_vertrag_nr ASC
    5. INTO OUTFILE 'C:/Unternehmen_VISION/Downloads/Vorgangsdaten.txt'
    6. FIELDS ENCLOSED BY ''
    7. TERMINATED BY ';'
    8. LINES TERMINATED BY '\r\n'
    9. "


    WHERE ist hier statisch.
    Es soll durch eine Variable in folgender Form geändert werden:

    VB.NET-Quellcode

    1. Dim ds_stamm_id = Me.ds_stamm_id.Text
    2. Using connection As New MySqlConnection(My.Settings.db_vision_client)
    3. [color=#FF0000]Dim cmd As New MySqlCommand(CSV_Abfrage & ds_stamm_id, connection)[/color]
    4. cmd.Connection.Open()
    5. cmd.ExecuteNonQuery()
    6. End Using


    Ich weiß der Code ist falsch aber auf Grund dessen der WHERE Block sich mitten in der Abfrage befindet und auch nicht ans Ende verlegt werden kann habe ich keine Ahnung wie ich die Variable ds_stamm_id statt der '1' einfügen kann.
    Wenn ich dich richtig verstehe dann sollte das eine Lösung sein. String-Interpolation(Beachte das $-Zeichen vorm String, Variablen die in geschweiften Klammern stehen, werden dann in den String reingebaut.

    VB.NET-Quellcode

    1. Dim where As String = "ds_vertrag_nr = 1"
    2. Dim query As String = $"SELECT ds_vertrag.* FROM ds_vertrag WHERE {where} INTO......."
    3. MessageBox.Show(query)

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Danke für Deine Antwort und Mühe
    Ja/Nein... :) Die Nummer '1' ist hier die Variable. Es ist nicht immer die 1. Es kann auch 5 oder 230 ...sein. Ich wollte sagen, das sich der Wert von "ds_vertrag_nr" immer ändert.

    Nachtrag:
    Ich kann also einfach "Dim where As String = Me.ds_vertrag_nr.text" schreiben? (Ich kann es gerade nicht testen.)
    Wie ich sagte, der Wert der Variablen wird dann in den String eingebaut. Mach eine Funktion die einen Integer als Parameter erfordert, mit String-Interpolation einen String bilden und zurückgeben.

    VB.NET-Quellcode

    1. Private Function GetQueryForDsVertrag(ds_vertrag_nummer As Integer) As String
    2. Return $"SELECT ds_vertrag.* FROM ds_vertrag WHERE ds_vertrag_nr = {ds_vertrag_nummer} INTO......."
    3. End Function


    Oder auch mit mehreren Paramtern(z.B. einen String für die Zieldatei), du kannst so viele Variablen rein interpolieren lassen wie du willst.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Es ist jetzt gerade so:

    VB.NET-Quellcode

    1. Dim ds_stamm_id As String = Me.ds_stamm_id.Text
    2. Dim CSV_Abfrage As String = $"SELECT ds_vertrag.*
    3. FROM ds_vertrag
    4. WHERE ds_vertrag_nr = {ds_stamm_id}
    5. ORDER BY ds_vertrag_nr ASC
    6. INTO OUTFILE 'C:/Unternehmen_VISION/Downloads/Vorgangsdaten.txt'
    7. FIELDS ENCLOSED BY ''
    8. TERMINATED BY ';'
    9. LINES TERMINATED BY '\r\n'"


    ...und funktioniert. Vielleicht für den Fall das es jemanden interessiert; die Reihenfolge der Abfrageparameter muß beachtet werden = FROM; WHERE; ORDER...
    @Thomas2705 Pack die Datei als Variable da hinein, das lässt sich leichter ändern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Da kommt schon das nächste Problem:

    VB.NET-Quellcode

    1. Dim ds_stamm_id As String = Me.ds_stamm_id.Text
    2. Dim Beschreibung As String = "Vorgangsdaten.txt"
    3. Dim Outfile As String = "C:/Unternehmen_VISION/Downloads/" & ds_stamm_id & Beschreibung
    4. Dim CSV_Abfrage As String = $"SELECT ds_vertrag.*
    5. FROM ds_vertrag
    6. WHERE ds_vertrag_nr = {ds_stamm_id}
    7. ORDER BY ds_vertrag_nr ASC
    8. [color=#FF0000]INTO OUTFILE = {Outfile}[/color]
    9. FIELDS ENCLOSED BY ''
    10. TERMINATED BY ';'
    11. LINES TERMINATED BY '\r\n'"


    INTO OUTFILE wird wieder nur als Fehler erkannt.

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

    Thomas2705 schrieb:

    INTO OUTFILE = {Outfile}
    FIELDS ENCLOSED BY ''


    Klar ist das falsch, mach hinter der geschweiften Klammer ein Space rein. Das oben wird zu
    .....Vorgangsdaten.txtFIELDS ENCLOSED BY......
    Mit einem Haltepunkt hättest du mal in die Variable reinschauen können nachdem sie befüllt wurde.

    Debuggen, Fehler finden und beseitigen

    Aber ganz ehrlich, nimm besser das mit den Command-Parametern.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Scheiße ich bin zu blöd.
    Sowohl mit Leerzeichen als auch mit ; funktioniert nicht....

    VB.NET-Quellcode

    1. Dim CSV_Abfrage As String = $"SELECT ds_vertrag.*
    2. FROM ds_vertrag
    3. WHERE ds_vertrag_nr = {ds_stamm_id}
    4. ORDER BY ds_vertrag_nr ASC
    5. INTO OUTFILE = {Outfile}
    6. FIELDS ENCLOSED BY ';'
    7. TERMINATED BY ';'
    8. LINES TERMINATED BY '\r\n'"
    @Thomas2705 Oder Du erstellst zum Test zwei Variablen, eine wie vorher, die funktioniert, und eine neue, und dann vergleichst Du beide.
    Einen Haltepunkt brauchst Du trotzdem. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das Problem ist wirklich in der Syntax:

    VB.NET-Quellcode

    1. INTO OUTFILE 'C:/Unternehmen_VISION/Downloads/Vorgangsdaten.txt'


    funtioniert problemlos.

    Wenn ich den Parameter auseinandernehme:

    VB.NET-Quellcode

    1. Dim Outfile As String = "C:/Unternehmen_VISION/Downloads/Vorgangsdaten.txt"
    2. INTO OUTFILE = {Outfile}


    ergibt es den Fehler. Scheiße
    Ahhh, jetzt seh ich es. Die beiden ' fehlen. Bei Variante 1 schreibst du sie rein, bei der 2. sind sie nicht da.
    So sollte das
    '{Outfile}'
    Oder:
    Dim Outfile As String = "'C:/Unternehmen_VISION/Downloads/Vorgangsdaten.txt'"

    Bei einem Vergleich wie RodFromGermany ihn empfohlen hat, wäre dir das sicher auch aufgefallen ;(
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Sorry, das ich das empfohlen hab. Mit NET nutze ich kein MySql, aber Sqlite. Da nutze ich auch Command-Parameter, ich hätte schauen sollen ob das auch mit MySqlCommand geht. Ist identisch wie beim SqliteCommand.

    Aber verloren ist die Zeit nicht wirklich, weil du hast was gelernt. Wenn du nun auch noch den Thread durcharbeitest den ich verlinkt habe, lernst du sogar richtig zu debuggen. Ohne debuggen zu können kann man Fehler oft nur sehr sehr schwer finden. Haltepunkte sind ein richtig wichtiges Werkzeug und die sollte man durchaus nutzen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D