![]() |
Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: ZeosLib
"Unterminated quoted string ..." bei Insert von RT
Ich habe bei meinen aktuellen PostgreSQL-Tests folgendes Problem beim Exportieren bestehender Datenbank-Tabellen aus unserer bisherigen Pervasive-Datenbank nach Postgres:
Wir speichern bisher u.a. RTF-Dokumente in Stringfeldern. Wenn ich diese jedoch über einen Insert-Befehl in ein varchar-Feld einfügen will, bekomme ich bei manchen Datensätzen den besagten Fehler: Zitat:
Delphi-Quellcode:
Wenn ich mir im Debugger über Strg + F7 ansehe, was in meiner Query.SQL-Liste drinsteht, dann schaut das so aus:
QuotedStr(StringReplace(Value, '\', '\\', [rfReplaceAll]));
SQL-Code:
Die Steuerzeichen #1 stehen in der bisherigen Pervasive-Datenbank ebenfalls drin, wozu die sind, weiß ich jedoch nicht. Allerdings scheinen die nicht die Ursache zu sein, da es wiederum auch RTF-Datensätze gibt, die ich erfolgreich einfügen kann, und die ebenfals diese Sonderzeichen enthalten.
'INSERT INTO kartei (kk_kulikz, kk_patnr, kk_datum, kk_scheinnr, kk_plnr, kk_zeit, kk_satznr, kk_arztkz, kk_plkuerzel, kk_termnr, kk_text01, kk_text02, kk_text03, kk_text04, kk_text05) VALUES (1, 1, 20050906, 2, 100111, 16460237, 0, '*', 'lab', 5, '{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031{\\fonttbl{\\f0\\fnil Arial;}}'#1'{\\colortbl ;\\red0\\green0\\blue0;}'#1'\\viewkind4\\uc1\\pard\\cf1\\f0\\fs22 Lab'#1'\\par }'#1#0'', '', '', '', '');'#$D#$A
Was könnte nun die Ursache dafür sein? |
Re: "Unterminated quoted string ..." bei Insert vo
Man könnte den String auch Encodieren. Ich würde aber (SQL-)Parameter verwenden
|
Re: "Unterminated quoted string ..." bei Insert vo
Hallo,
liegt der Fehler hierin?
Delphi-Quellcode:
Da sind wohl im RTF einzelne ', das könnte dazu führen, dass hier eine Ende eines Strings erkannt wird, wo eigentlich kein Ende ist. Eventuell hilft es mit
'{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031{\\fonttbl{\\f0\\fnil Arial;}}'#1'{\\colortbl ;\\red0\\green0\\blue0;}'#1'\\viewkind4\\uc1\\pard\\cf1\\f0\\fs22 Lab'#1'\\par }'#1#0''
Delphi-Quellcode:
auch aus den einfachen ' doppelte ' zu machen. Probiere das Ganze aber bitte (wenn möglich) vorher mit Parametern, eventuell kommst Du dann um das ganze StringReplacen rum.
QuotedStr(StringReplace(StringReplace(Value, '\', '\\', [rfReplaceAll])),'''','''''',[rfReplaceAll]);
|
Re: "Unterminated quoted string ..." bei Insert vo
Das wäre jetzt meine nächste Frage gewesen, wie ich so Queries etwas einfacher gestalten kann und mir diese SQL-Skripte nicht von Hand zusammenbasteln muss. Das geht also über Parameter. Hat einer von euch ein Beispiel parat, wie ich mit Parametern arbeite? Ist mir noch völlig neu, wie so vieles auf diesem Gebiet...
|
Re: "Unterminated quoted string ..." bei Insert vo
Zitat:
Delphi-Quellcode:
Query.SQL.Text := 'INSERT INTO kartei (kk_kulikz, kk_patnr, kk_datum, kk_scheinnr, kk_plnr, kk_zeit, kk_satznr, kk_arztkz, kk_plkuerzel, kk_termnr, kk_text01, kk_text02, kk_text03, kk_text04, kk_text05) VALUES (:kk_kulikz, :kk_patnr, :kk_datum, :kk_scheinnr, :kk_plnr, :kk_zeit, :kk_satznr, :kk_arztkz, :kk_plkuerzel, :kk_termnr, :kk_text01, :kk_text02, :kk_text03, :kk_text04, :kk_text05);';
... Query.ParamByName('kk_kulikz').Value := 1; ... |
Re: "Unterminated quoted string ..." bei Insert vo
:dancer: Shit ist das genial. Funktioniert ohne Mullen und Knullen über die Parameter :thumb: . Und ich muss mich um rein gar nichts mehr selbst kümmern. Vielen Dank für den Tipp! Ich sehe, ich hab noch viel zu lernen im Umgang mit Query und Co. :dancer:
|
Re: "Unterminated quoted string ..." bei Insert vo
Und man muss nicht immer den Abfargestring setzen, sondern nur die geänderten Parameter.
|
Re: "Unterminated quoted string ..." bei Insert vo
Dann möchte ich gerne noch zwei allgemeine Fragen zum Thema Datenbanken stellen bzw. genau genommen sind sie eigentlich PostgreSQL-spezifisch.
Unsere bisherige Pervasive-Datenbank war Dateibasiert, d.h. wir konnten eine gewisse Datenbank-Datei eindeutig einer Tabelle zuordnen (Tabellenname = Dateiname). Außerdem waren alle Tabellen-relevanten Daten innerhalb der Datei gespeichert. D.h. wir konnten bisher Datenbank-Tabellen, die lediglich statische Daten beinhalteten, hier im Haus aufbereiten und dann lediglich die fertigen Dateien auf die Rechner beim Kunden kopieren, und schon konnten sie verwendet werden. Bei PostgreSQL geht das z.B. nicht oder zumindest nicht so einfach. Bei vielen anderen aktuellen DBMS wird das ähnlich sein. Wie ist da der Weg, Daten an den Kunden auszuliefern? Über SQL-Skript-Dateien? Wobei das Einlagern von Datensätzen dadurch ungleich länger dauern dürfte als beim bloßen Kopieren einer Datei. Zweiter Punkt ist die Thema Datensicherung. Da ich keine eindeutige Zuordnung von Tabelle zu Datei mehr habe, bzw. innerhalb dieser einen Datei nicht alle Tabellen-relevanten Daten gespeichert werden, bin ich doch gezwungen, bei einer Datensicherung das komplette Datenverzeichnis zu sichern, auch wenn es sich bspw. bei 3/4 aller Tabellen um statische Daten handeln würde, die ich mir jederzeit neu erzeugen könnte und die nur unnötig Platz in der Datensicherung belegen würden. Wie ist der Weg hier bei einem "modernen" DBMS wie PostgreSQL? |
Re: "Unterminated quoted string ..." bei Insert vo
Hallo,
schau mal bitte, ob Du hier fündig wirst: ![]() Das Programm Deiner Wahl dürfte pg_dump sein:
Code:
Habe zugegebenermaßen keine Ahnung davon, aber auf den ersten Blick sieht es so aus, als könnte das von Dir gesuchte dabei sein.
c:\Programme\PostgreSQL\8.3\bin>pg_dump -?
pg_dump dumps a database as a text file or to other formats. Usage: pg_dump [OPTION]... [DBNAME] General options: -f, --file=FILENAME output file name -F, --format=c|t|p output file format (custom, tar, plain text) -i, --ignore-version proceed even when server version mismatches pg_dump version -v, --verbose verbose mode -Z, --compress=0-9 compression level for compressed formats --help show this help, then exit --version output version information, then exit Options controlling the output content: -a, --data-only dump only the data, not the schema -b, --blobs include large objects in dump -c, --clean clean (drop) schema prior to create -C, --create include commands to create database in dump -d, --inserts dump data as INSERT commands, rather than COPY -D, --column-inserts dump data as INSERT commands with column names -E, --encoding=ENCODING dump the data in encoding ENCODING -n, --schema=SCHEMA dump the named schema(s) only -N, --exclude-schema=SCHEMA do NOT dump the named schema(s) -o, --oids include OIDs in dump -O, --no-owner skip restoration of object ownership in plain text format -s, --schema-only dump only the schema, no data -S, --superuser=NAME specify the superuser user name to use in plain text format -t, --table=TABLE dump the named table(s) only -T, --exclude-table=TABLE do NOT dump the named table(s) -x, --no-privileges do not dump privileges (grant/revoke) --disable-dollar-quoting disable dollar quoting, use SQL standard quoting --disable-triggers disable triggers during data-only restore --use-set-session-authorization use SESSION AUTHORIZATION commands instead of ALTER OWNER commands to set ownership Connection options: -h, --host=HOSTNAME database server host or socket directory -p, --port=PORT database server port number -U, --username=NAME connect as specified database user -W, --password force password prompt (should happen automatically) If no database name is supplied, then the PGDATABASE environment variable value is used. Report bugs to <pgsql-bugs@postgresql.org>. |
Re: "Unterminated quoted string ..." bei Insert vo
Also sehe ich das richtig, dass zumindest mit PostgreSQL ein bloßes Hin- und Herkopieren von Dateien nicht mehr möglich ist? Man muss also auf zusätzliche Tools setzen. Nungut, das soll kein Hinderungsgrund sein, muss man sich halt umgewöhnen.
Auf alle Fälle habe ich das pg_dump und pg_restore über das pgAdmin-Programm mal ausprobiert und ein Backup einer recht großen Tabelle erzeugt und diese wieder zurückgespielt. Das Erzeugen ging recht fix und die Kompressionsrate war auch recht ordentlich, das Zurückspielen hat dann aber etwas gedauert. Gut, damit muss man dann leben. Die Auslieferung statischer Tabellen an den Kunden würde man dann auch darüber realisieren? Also die Tabelle hier im Haus aufbereiten, ein komprimiertes Backup davon erzeugen (weil die Tabellen doch sehr umfangreich sein können) und das dann vor Ort mittels pg_restore einspielen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz