AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi "Unterminated quoted string ..." bei Insert von RTF-Dokument
Thema durchsuchen
Ansicht
Themen-Optionen

"Unterminated quoted string ..." bei Insert von RTF-Dokument

Ein Thema von MatthiasR · begonnen am 11. Mär 2009 · letzter Beitrag vom 12. Mär 2009
Antwort Antwort
Seite 1 von 2  1 2      
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#1

"Unterminated quoted string ..." bei Insert von RT

  Alt 11. Mär 2009, 13:02
Datenbank: PostgreSQL • Version: 8.3 • Zugriff über: ZeosLib
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:
SQL Fehler: ERROR: unterminated quoted string at or near "'{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1031{\ \fonttbl{\\f0\\fnil Arial;}}{\\colortbl ;\\red0\\green0\\blue0;}\\viewkind4\\uc1\\pard\\c f1\\f0\\fs22 Lab\\par }"
LINE 1: ... 20050906, 2, 100111, 16460237, 0, '*', 'lab', 5, '{\\rtf1\\...
Ich weiß echt nicht, was ich da falsch mache. Beim zusammenstellen des Insert-Skripts verwende ich die Funktion QuotedStr und ersetze ausserdem jeden Backslash durch den doppelten Backslash:
QuotedStr(StringReplace(Value, '\', '\\', [rfReplaceAll])); Wenn ich mir im Debugger über Strg + F7 ansehe, was in meiner Query.SQL-Liste drinsteht, dann schaut das so aus:
'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 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.

Was könnte nun die Ursache dafür sein?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 13:04
Man könnte den String auch Encodieren. Ich würde aber (SQL-)Parameter verwenden
Markus Kinzler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 13:09
Hallo,

liegt der Fehler hierin?
'{\\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'' 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
QuotedStr(StringReplace(StringReplace(Value, '\', '\\', [rfReplaceAll])),'''','''''',[rfReplaceAll]); 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.
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#4

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 13:17
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...
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 13:20
Zitat von Infect:
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...
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;
...
Markus Kinzler
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#6

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 14:20
Shit ist das genial. Funktioniert ohne Mullen und Knullen über die Parameter . 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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 14:45
Und man muss nicht immer den Abfargestring setzen, sondern nur die geänderten Parameter.
Markus Kinzler
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#8

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 16:42
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?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 11. Mär 2009, 16:52
Hallo,

schau mal bitte, ob Du hier fündig wirst: PostgreSQL Datensicherung
Das Programm Deiner Wahl dürfte pg_dump sein:
Code:
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>.
Habe zugegebenermaßen keine Ahnung davon, aber auf den ersten Blick sieht es so aus, als könnte das von Dir gesuchte dabei sein.
  Mit Zitat antworten Zitat
MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#10

Re: "Unterminated quoted string ..." bei Insert vo

  Alt 12. Mär 2009, 09:44
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz