Update auf Firebird-DB mit FireDAC unter DXE7, Problem mit Umlauten, Unicode/Win1251 Zeichensatz

    Update auf Firebird-DB mit FireDAC unter DXE7, Problem mit Umlauten, Unicode/Win1251 Zeichensatz

    Hallo,

    ich nutze Delphi XE7 und möchte über FireDAC eine Tabelle einer Firebird Datenbank aktualisieren.

    SQL-Abfrage

    1. UPDATE "Table"
    2. SET "Vorname" = 'Hans', "Strasse" = 'Meine Straße' ....


    Problem ist, dass die Umlaute und Sonderzeichen nicht korrekt in die Datenbank eingetragen werden.

    Beispiel die Straße: SchulstraЯe 58

    Die Anmeldung an die Datenbank wird mit dem Zeichensatz (Charset) = WIN1251 gemacht.

    Der SQL-Befehl wird wie folgt abgesetzt:

    Delphi-Code

    1. procedure ExecuteUpdate;
    2. const sUpdateError = 'Zeile %d: %s :: %s';
    3. var i: integer;
    4. begin
    5. for i := 0 to UpdateList.Count - 1 do
    6. begin
    7. // 1. Versuch:
    8. Query.SQL.Text := UpdateList[i];
    9. // Später 2. Versuch: Query.SQL.Text := AnsiString(UpdateList[i]); <-- Einfach mal versucht zu casten, hatte aber keine Auswirkung
    10. Query.Transaction.StartTransaction;
    11. try
    12. Query.ExecSQL;
    13. Query.Transaction.Commit;
    14. except
    15. on E:Exception do
    16. begin
    17. FErrors.Add( format(sUpdateError, [i, UpdateList[i], E.Message]) );
    18. Query.Transaction.Rollback;
    19. end;
    20. end;
    21. end;
    22. end;

    • UpdateList ist eine TStringList
    Was muss ich machen, damit das Update im korrekten Zeichensatz eingefügt wird.
    Ich ging eigentlich davon aus, dass die Datenbankkomponenten das von sich aus übernehmen.

    Gruß
    Antonio
    Mal mit Parametern versucht?

    [*]

    SQL-Abfrage

    1. UPDATE TabellenName SET Vorname = :Vorname, Strasse = :Strasse ...
    [*]

    Delphi-Code

    1. Query.SQL.ParamByName('Vorname').AsString := 'Hans';
    2. Query.SQL.ParamByName('Strasse').AsString := 'Meine Straße';


    Dann müsste auch die Komponente den richtigen Zeichensatz übernehmen.
    Hallo,

    nein, da die aktuelle Implementation eine Stringliste mit Update SQL-Befehlen erstellt,
    die zu einem späteren Zeitpunkt in der Anwendung ausgeführt werden.

    NACHTRAG:

    Ich habe das Projekt mit einer entsprechenden Funktion ausgestattet um es mit Parameter auszuführen.
    Leider bleibts gleich. Habe auch Query.SQL.ParamByName('Strasse').AsAnsiString := 'Meine Straße'; versucht,
    ein explizites Casting mit AnsiString() und eine Konvertierung über die Codepage...
    Es brachte alles kein Erfolg. Die Sonderzeichen wurden unterschiedlich dargestellt, aber nie korrekt.

    Ich bin überfragt...

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