Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird: Incorrect values within SQLDA structure (https://www.delphipraxis.net/167736-firebird-incorrect-values-within-sqlda-structure.html)

TheMiller 15. Apr 2012 20:05

Datenbank: Firebird • Version: 2.5 • Zugriff über: UniDAC

Firebird: Incorrect values within SQLDA structure
 
Hallo,

hier der nächste Fehler, den ich auch nach dem Googeln nicht beheben kann. Bei einer Update-Query eines Blob-Felder kommt - manchmal - folgende Fehlermeldung

Zitat:

Incorrect values within SQLDA structure.
Habe ihn gegoogelt und nur die Antwort gefunden, dass es sich um die falsche fbclient.dll/fbembed.dll handelt. Das kann in meinem Fall aber nicht ganz sein. Aber von Anfang an:

Ich habe eine 2.1-DB und mache ein Update auf 2.5

1. Neueste Firebird-Embedded-Dateien (v2.5) in der App-Verzeichnis kopieren
2. Mit gbak die 2.1-er DB sichern
3. Unter Verwendung der neuen DLLs eine neue (2.5) DB erzeugen
(CREATE DATABASE ''test.db'' USER ''sysdba'' PASSWORD ''1234'' PAGE_SIZE 4096 DEFAULT CHARACTER SET UTF8)
4. Mit gbak die Daten zurücksichern (Optionen: gbak.exe -R o -v)
5. Alles fertig.

Alles funktioniert. Nun fülle ich in einer Schleife ganz viele Blob-Text-Felder und irgendwann erscheint einfach o.g. Meldung. Die Blob-Daten werden als Parameter übergeben.

EDIT: Lasse ich das Update komplett weg und fülle einfach die alte DB unter Verwendung der neuen DLL mit den BLOB-Daten, klappt alles. Könnte also am CREATE DATABASE liegen, oder?

Was könnte die Ursache dafür sein?

Danke im Voraus für eure Geduld und Hilfe!

tsteinmaurer 16. Apr 2012 09:35

AW: Firebird: Incorrect values within SQLDA structure
 
Was bringt dir das Erzeugen der Datenbank mit CREATE DATABASE, wenn du eh ein Restore machst?

TheMiller 16. Apr 2012 11:14

AW: Firebird: Incorrect values within SQLDA structure
 
Hi,

ich wollte erreichen, ein Update der Firebird-DB von Version 2.1 auf 2.5 zu machen, und zwar durch ein automatisches Programmupdate beim Kunden (Internet-Download, d.h. ich kenne die Kunden/Benutzer nicht und kann daher nicht eingreifen).

Also wurde mir geraten, mit gbak ein Backup zu machen, eine neue Datenbank über die 2.5-er Lib zu erstellen und das Backup wieder einzuspielen. Ich habe das in einem anderen Thread schonmal gepostet, aber hier nochmal meine Vorgehensweise und dann die Frage: Habe ich jetzt eine richtige 2.5er Datenbank? Der Fehler ist übrigens mit der Umstellung auf AsMemo erstmal verschwunden.

-------
Backup via gbak.exe
gbak.exe -b -g -z -v -i -IG -user SYSDBA test.db test.db.bak

Umbennen test.db -> test_tmp.db (nur, damit ich zur Not auf sie wieder zurückgreifen kann)

Neue DB erstellen via SQL-Query:
CREATE DATABASE ''test.db'' USER ''sysdba'' PASSWORD ''1234'' PAGE_SIZE 4096 DEFAULT CHARACTER SET UTF8

Restore via gbak.exe
gbak.exe -R o -v -user sysdba -password 1234 test.db.bak test.db

Neues Feld erstellt via SQL-Query:
ALTER TABLE test1 ADD PLAINTEXT BLOB SUB_TYPE TEXT;
-------

Ich kenne mich mit Firebird noch nicht so gut aus.

Danke

exilant 16. Apr 2012 11:48

AW: Firebird: Incorrect values within SQLDA structure
 
Das erstellen mittels "create database" kannst du dir schenken. Die Datenbank wird von GABK -R o überschrieben. IMO ist es nicht möglich, bei einer existierenden Datenbank den DEFAULT CHARSET von NONE auf UTF8 zu ändern. Da wird dir vermutlich nur das umpumpen der Daten bleiben.

Siehe auchhttp://tech.groups.yahoo.com/group/f...message/110424

tsteinmaurer 16. Apr 2012 11:49

AW: Firebird: Incorrect values within SQLDA structure
 
Mit dem "gbak -R ..." Restore überschreibst du die mit CREATE DATABASE erstellte Datenbank, darum macht das CREATE DATABASE keinen Sinn. Der Umstieg von 2.1 auf 2.5 kann High-Level mäßig wie folgt skizziert werden:

1) Backup der Datenbank mit Firebird 2.1
2) Restore der Datenbank mit Firebird 2.5

Hiermit bekommst du eine Datenbank mit einer Firebird 2.5 ODS (On-Disk-Structure). Firebird 2.5 kann sich allerdings auch auf eine Firebird 2.1 ODS Datenbank verbinden, d.h. um Firebird 2.5 mit einer 2.1 Datenbank zu verbinden, ist notwendigerweise kein Backup/Restore notwendig, aber es wird empfohlen.

In 2) könnte sich allerdings herausstellen, dass "Malformed-String" Einträge in [VAR]CHAR / BLOB Felder enthalten sind, dann müßte man im Schritt 2) die unterschiedlichen -FIX Parameter von gbak.exe anwenden. Bzgl. Backup/Restore mußt du nicht notwendigerweise über gbak.exe gehen, sondern könntest auch ein Backup/Restore über die Services API in deine Anwendung direkt integrieren, sofern UniDAC dieses Firebird-Spezifikum unterstützt. IBDAC hat fürs Backup/Restore spezielle Komponenten, wobei ich jetzt nicht sagen kann, ob die -FIX Parameter hier auch unterstützt werden.

EDIT: Ich denke, ich kapiere nun, dass du auch eine Zeichensatz-Umstellung von NONE auf UTF8 vorhast? Da hilft dir kein Backup/Restore.

TheMiller 16. Apr 2012 12:13

AW: Firebird: Incorrect values within SQLDA structure
 
Hallo,

ja ganz richtig. Ich möchte einen Default-Characterset angeben. Ich muss aber im Vorfeld dazu schreiben, dass ich sowieso alle Felder und Daten im UTF8-Format gespeichert habe. Die ganze DB ist UTF8 und alle Daten darin auch. Der einzige Unicode-Fehler - der hier die letzten Tage diskutiert wurde - war der, dass ich nicht AsMemo, sondern AsString im BLOB gespeichert habe.

Also nur Backup und Restore mit gbak machen und das CREATE DATABASE rausschmeißen? Kann ich nachträglich einen Defaul-Charset angeben? Wenn ja sowieso schon immer alles UTF8 war dürfte ja nichts passieren und ich könnte mir das Eintragen der Charsets bei den Feldern sparen.

Wie kann ich prüfen, ob ich nun wirklich eine 2.5er-DB habe?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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