dbExpress und Sonderzeichen



  • Hallo,

    ich habe folgendes Problem. Versuche seit kurzen ein Programm vom C++ Builder 5 auf C++ Builder 2009 umzustellen. Im alten Programm habe ich über die BDE Komponenten auf eine MySQL-Datenbank zugegriffen. Das selbe versuche ich jetzt über dbExpress zu machen. Das Problem was dabei auftritt ist ein Doppelpunkt. Früher hat der keine Probleme gemacht (Daten werden aus einer txt-Datei eingelesen). Jetzt kommt immer eine Fehlermeldung wenn ich ihn unbearbeitet lasse.

    std::string doublehighcomma(std::string str) 
    {
      //Hochkommas (') verdoppeln um diesen String in einer SQL Anweisung wenden zu können
      int pos=0;
      std::string str1=str;
      while ((pos=str.find('\'',pos))>=0) 
      {
          str.insert(++pos, 1, '\'');
          pos++;
      }
      return str;
    
    }
    

    Beim Hochkomma hab ich das so gelöst. Wenn ich die BDE-Komponente benutzte kann ich das mit dem Doppelpunkt fast genauso lösen indem ich den Doppelpunkt verdopple. Bei der dbExpress Komponente führt er dann zwar die SQL-Anweisung aus, schreibt aber auch zwei Doppelpunkte in die Datenbank. Hab auch schon mit \: und ': versucht geht alles nicht.

    Wäre nett wenn mir einer helfen könnte
    Danke!



  • mat_0815 schrieb:

    Jetzt kommt immer eine Fehlermeldung wenn ich ihn unbearbeitet lasse.

    Und wie lautet diese?



  • kpeter schrieb:

    Und wie lautet diese?

    Im Projekt ... ist eine Exception der Klasse EDatabaseError mit der Meldung 'No value for parameter '1" aufgetreten.

    Das Problem ist einfach, dass der : im SQL String wie ein ' wirkt und somit bei dem INSERT INTO-Befehl zu dem Problem führt.

    Mal noch als Beispiel:
    Ich führ folgenden SQL-Befehl aus:

    INSERT INTO table (feld1,feld2,...,feld5) VALUES(NULL,'2:1',...,'test')
    

    Die Values werden dabei mittels ifstream, getline(buff,bufflen) aus einer txt-Datei gelesen und dem SQL-Befehl angehängt und dann ausgeführt.



  • Du mußt bei der verwendeten Komponente ParamCheck auf false setzen, da alle Doppelpunkte mit Text dahinter als Parameter angesehen werden und dadurch entsteht dann die Fehlermeldung. Alternativ kannst du auch die Werte als Parameter übergeben, z.B.:

    SQLQuery1->SQL->Add("INSERT INTO table (feld1,feld2,...,feld5) VALUES(:feld1,:feld2,...,:feld5)");
    SQLQuery1->ParamByName("feld1")->Value.Clear(); //Entspricht NULL
    SQLQuery1->ParamByName("feld2")->Value = "2:1";
    ...
    SQLQuery1->ParamByName("feld5")->Value = "test"
    SQLQuery1->ExecSQL();
    

    Der Vorteil hierbei ist zum einen, daß die Konvertierung in Zahlen oder Strings automatisch erfolgt, man sich also nicht um die Hochkommas kümmern muß, und zum anderen kann man damit SQL-Injection etwas vorbeugen.



  • Danke Linnea für die schnelle Hilfe!

    Funktioniert genau wie du es beschrieben hast. Werde das jetzt mal noch mit den Parametern ausprobieren.


Anmelden zum Antworten