CString Format mit dynamischer Variablen-Anzahl



  • Hallo,

    Ich weiss, dass ich mit CString::Format eine Variable in einen SQL-Befehl einbinden kann. Das Problem ist allerdings, dass die Anzahl der Variablen unterschiedlich sein kann, da ich mit einem CStringArray arbeite und bei diesem auch etwas eingefügt werden kann.

    Ich habe mir schon überlegt es mit einer Schleife zu realisieren, allerdings ist mir noch kein richtiger Weg eingefallen...

    Bin jetzt aber schon so weit das ich folgenden String habe:
    INSERT INTO tabellenname VALUES('%s','%s'),wert1,wert2

    Das heißt, ich weiss wie oft ich einen Platzhalter einsetzen muss und habe auch die entsprechenden Werte.
    Das bringt aber alles nichts wenn diese nicht als Paramter bei CString::Format eingegeben werden.

    Gibt es also einen Weg die Anzahl der Variablen im Aufruf von Format irgendwie dynamisch zu gestalten?



  • naja, du könntest deinen formatstring ja auch dynamisch zusammenbauen, dh ein einer schleife für jeden parameter ein %s oder %d einbauen.



  • Das hab Ich ja schon gemacht!
    Mein array hat zurzeit 7 Einträge, dass heißt ich in meinem String schonmal sieben mal '%s'.

    Das Problem ist zurzeit halt, dass die Werte nicht für die Platzhalter eingefügt werden wenn der String so aussieht wie in meinem ersten Beitrag( INSERT INTO tabellenname VALUES('%s','%s'),wert1,wert2 ).

    Aber trotzdem danke..



  • ah, jetzt versteh ich dich. in diesem fall wirst du den string händisch zusammenbauen müssen, bzw einen formatstring bauen und mit CString::Replace arbeiten.

    zb: INSERT INTO (a1,a2) VALUES(@1,@2)

    dieses ersetzen kannst dann in einer schleife machen.



  • Durch dein Replace bin ich auf eine Idee gekommen.
    Ich habe jetzt folgende Schleife:

    for(int i=0; i<Array.GetSize(); i++)
    	{
    		String2 += Array.GetAt(i);
    		String2 += ",";
    	}
    

    Nach der Schleife wird das letzte Komma wieder gelöscht.
    Ich habe jetzt im ersten String also
    INSERT INTO tabellenname VALUES ('%s','%s') und im zweiten:
    wert1,wert2

    Danach hab ich einen dritten String erstellt und die Format-Funktion aufgerufen.
    String3.Format(String1,String2)

    Eigentlich müsste das alles passen. Allerdings bekomme ich beim Format eine Unbehandelte Ausnahme..
    mmh..



  • format schrieb:

    Ich weiss, dass ich mit CString::Format eine Variable in einen SQL-Befehl einbinden kann.

    Solltest du aber nicht. Stichwort SQL Injection. So etwas überlässt man der DB-API.



  • die Ausnahme bedeutet meistens, dass du zu wenige Parameter angegeben hast. wie ich das sehe, hast du aber nur mehr einen parameter, nämlich deinen zusammengesetzen string. so kann das nicht funktionieren.



  • Stimmt! Klingt einleuchtend.
    Aber ich weiss noch nicht so recht wie ich das mit Replace machen soll..



  • du baust dir in einer schleife folgenden string zusammen:

    INSERT INTO (a1,a2,an) VALUES(1,2,n)

    ok, eigentlich sind das 2 schleifen, jeweils bis Array.GetSize(). bei dieser variante brauchst du gar kein replace!

    also:

    CString insert;
    CString values;
    
    for(int i = 0;i < array.GetSize();++i)
    {
      insert += ...  // namen
      values += .... // werte
    }
    
    // jetzt noch die überflüssigen , wegschneiden und dann insert + values
    


  • juhu!
    Es hat funktioniert! 🙂

    Der Fehler lag also darin, dass ich nicht pro Wert im Array ein Platzhalter in den String schreibe sondern das ich nur einen Platzhalter habe und diesen dann mit einer Variable fülle in der alle Werte mit Kommas getrennt sind.
    ahaaa!

    Vielen Dank dwo77! 👍


Anmelden zum Antworten