Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLIte and GUIDs in Binary BLOB Form (https://www.delphipraxis.net/190974-sqlite-guids-binary-blob-form.html)

wschrabi 24. Nov 2016 17:06

Datenbank: SQLite • Version: 3 • Zugriff über: UNIDAC

SQLIte and GUIDs in Binary BLOB Form
 
Hallo Leute,
ich habe eine SQLite3 DB wo die IDs (=GUIDs) als BLOB drin sind.
Jetzt möchte ich ein random GUID erzeugen.

Dachte mir es so:
Das CreateRandomGUID ist von hier: http://stackoverflow.com/questions/7...unicode-string(erzeugt einen HEXString)
Doch wie bekomme ich jetzt den myRandGUIDstr in die BLOB Felder.
MyQID ist ein Quote(ID) auf das blob feld in references.
das möchte ich in ReferenceID wieder als blob in location reinschreiben.

Doch wenn ich dann die DB mit Citavi (ist eine Citavi DB) aufmache, meckert er, daß die Umwandlung nicht stimmt.
Was mache ich falsch? Bin um jeden RAT dankbar.


Delphi-Quellcode:
       
   MyQID:=UniQuery1.FieldByName('MyID').AsString;
                 uniquery2.ParamByName('RefID').AsBlob:=TEncoding.ASCII.GetBytes(removeQ(MyQID));
                 //uniquery2.ParamByName('RefID').AsString:=GUIDToString(TGUID(MyQID));
                 CreateGUID(MyGuid0);
                 myRandGUIDstr:=CreateRandomGUID;
                 //myrandGUIDstr:=HexStrtostr(chminus(removebrakes(GUIDToString(MyGuid0))));
                 uniquery2.ParamByName('MyGUID').AsBlob:=TEncoding.ASCII.GetBytes(myRandGUIDstr);
                 
                 
               Label5.Caption:=Format('DB Record Ref-GUID: %s : LOC-GUID: %s',[uniquery1.FieldByName('MYID').AsString,myrandguidstr]);
               end

Der schöne Günther 24. Nov 2016 17:23

AW: SQLIte and GUIDs in Binary BLOB Form
 
Ich kenne Citavi nur als Benutzer, aber was ist denn wenn du die Sqlite-Datei mit einem Tool wie SQLite Expert aufmachst und die bereits bestehenden Einträge mit deinem vergleichst?

wschrabi 24. Nov 2016 20:03

AW: SQLIte and GUIDs in Binary BLOB Form
 
Danke, ja das habe ich auch so gemacht. Da bin ich dann drauf gekommen, daß man nicht mit ASCII encoden darf sondern mit ANSI. Dann wird der HEXSTRING schön als ANSI string ins blob feld geschrieben. Jetzt kann ich automatisch alle CitaviRecords mit den zug. Files auf der Festplatte verlinken, was sich dann in eine Sammlung von Docs zeigt, wo dann auf CLick auch der Volltext anzeigbar ist.

Besten DANK für alle die geholfen haben.
wschrabi:-D

himitsu 25. Nov 2016 09:06

AW: SQLIte and GUIDs in Binary BLOB Form
 
Wenn es nur ein HEXSTRING ist, dann gibt es doch keinen Unterschied zwischen ANSI und ASCII. :gruebel:

wschrabi 25. Nov 2016 09:35

AW: SQLIte and GUIDs in Binary BLOB Form
 
Ja es ist ein HEX STRING, doch war bei der Encoding bei einem Byte ein Unterschied. F5 war das Byte im HEXSTRING und nach blob Eintrag war es ein anderes. (weiß leider nicht mehr was es genau war.)
Wenn ich es dann zu ANSI umgestellt habe, war es ok. Bei BigEndian war es wie ANSI ok nur waren da immer 2 Bytes pro Zeichen wobei das 1. Byte immer 00 war.
Aber ASCII hat wie gesagt das eine Byte verfälscht und daher war auch der RefID Link falsch und Citavi meckerte irgendwas wegen einer nicht gültigen Umwandlung.:roll:

Ich mein es war ein string wo die Bytes jeweils als HEX Werte geschrieben waren, so wie man es in sqlite mit QUOTE(id) bekommt. (Ohne X' am Anfang natürlich.)

himitsu 25. Nov 2016 10:51

AW: SQLIte and GUIDs in Binary BLOB Form
 
OK, also doch nicht als String mit Hexadezimalen Zeichen mit 0-9 und A-F in 2 Zeichen pro Byte gespeichert?
Obwohl es oben eigentlich danach aussah.

$F5 liegt natürlich über $7F und ASCII hat nunmal nur 7 Bit.
Aber eigentlich liegen hexadezimale Zeichen voll im ASCII drin, also alles zwischen $20 und $7F, was praktisch in jeder Single- und Multibyte-Codierung gleich aussieht, abgesehn von 2-Byte Codierungen ala UCS2 oder UTF-16.

p80286 25. Nov 2016 13:24

AW: SQLIte and GUIDs in Binary BLOB Form
 
Zitat:

Zitat von himitsu (Beitrag 1354681)
OK, also doch nicht als String mit Hexadezimalen Zeichen mit 0-9 und A-F in 2 Zeichen pro Byte gespeichert?
Obwohl es oben eigentlich danach aussah.

$F5 liegt natürlich über $7F und ASCII hat nunmal nur 7 Bit.
Aber eigentlich liegen hexadezimale Zeichen voll im ASCII drin, also alles zwischen $20 und $7F, was praktisch in jeder Single- und Multibyte-Codierung gleich aussieht, abgesehn von 2-Byte Codierungen ala UCS2 oder UTF-16.

Ähh
ASCII hat 7Bit, da ist bei 0x7F Schluß. ExtendedASCII (IBM lässt grüßen) hat 8Bit.
Und sowohl bei Ansi, als auch (Extended)ASCII kommt es auf die Character Table an, wie der Wert interpretiert wird.
Hexadezimal ist nur eine Darstellung numerischer Werte, und diese Darstellung liegt allemal im 7Bit ASCII -Bereich.

Gruß
K-H

himitsu 25. Nov 2016 13:37

AW: SQLIte and GUIDs in Binary BLOB Form
 
Zitat:

7 Bit
Sagte ich doch?

Zitat:

Das CreateRandomGUID ist von hier: http://stackoverflow.com/questions/7...unicode-string (erzeugt einen HEXString)
Nunja, laut dem Code da oben liegen die Daten als HexString vor, also mit Zeichencodes von $30 bis $46.

p80286 25. Nov 2016 13:54

AW: SQLIte and GUIDs in Binary BLOB Form
 
Zitat:

Zitat von himitsu (Beitrag 1354692)
Zitat:

7 Bit
Sagte ich doch?

Naja 0xF5 ist als Wert außerhalb von ASCII, die einzelnen Zeichen liegen aber im ASCII-Bereich, das war nicht so ganz eindeutig.
(Ja ich schlage mich z.Zt. mit der Konvertierung von Texten in einer DB herum, da wird man zum Korinthenkacker)

Gruß
K-H

himitsu 25. Nov 2016 17:29

AW: SQLIte and GUIDs in Binary BLOB Form
 
Aber als Hex-String 'F5' passt es dennoch in ASCII. :stupid:


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