Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   GUID Feld von MSSQL nach Oracle und zurück (https://www.delphipraxis.net/186149-guid-feld-von-mssql-nach-oracle-und-zurueck.html)

egentur 7. Aug 2015 16:20

Datenbank: SQLServer • Version: 2014 • Zugriff über: AnyDAC

GUID Feld von MSSQL nach Oracle und zurück
 
Hallo zusammen...
Ich habe auf einem zentalen MSSQL Server Tabellen mit GUIDs als Primary Key (Feldtyp uniqueidentifiery)
Diese muss ich auf mehrer Oracle Clients (Oracle 11g) übertragen (Feldtype RAW(16)

wie bekomme ich das hin ?
qTargetQuery.FieldByName('GUID').AsString := qSourceData.FieldByName('GUID').AsString;
funktioniert nicht das der SQLServer z.B. {C87FC84A-EE47-47EE-842C-29E969AC5131} zurück liefert

Danke für jeden Hinweis

Sir Rufo 7. Aug 2015 16:34

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Da musst du mal in die Dokumentation schauen, wie so eine GUID aussieht
http://docwiki.embarcadero.com/Libra...e/System.TGUID
Delphi-Quellcode:
TGUID = packed record
    D1: Cardinal; // 4 Bytes
    D2: Word; // 2 Bytes
    D3: Word; // 2 Bytes
    D4: array[0..7] of Byte; // 8 Bytes
    class operator Equal(const Left, Right: TGUID): Boolean;
    class operator NotEqual(const Left, Right: TGUID): Boolean;
    class function Empty: TGUID; static;
    class function Create(const Data; BigEndian: Boolean = False): TGUID; overload; static;
    class function Create(const Data: array of Byte; AStartIndex: Cardinal; BigEndian: Boolean = False): TGUID; overload; static;
  end;
Dazu gibt es noch Delphi-Referenz durchsuchenSystem.SysUtils.StringToGUID und wenn man sich jetzt mal anschaut, was bei
Delphi-Quellcode:
SizeOf(TGUID)
herauskommt (16 Bytes?) dann kann man aus dem Record direkt eine Bytefolge erstellen.

egentur 10. Aug 2015 23:48

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Danke für die Antwort.
Habe noch ein Problem.
Wie bringe ich ein TADQuery bei OnNewRecord dazu
den in der DB eingestellten Defaultwert für ein Feld zu nutzen

Habe ein ID Feld in Oracle RAW(16) not null default SYS_GUID() bzw.
in SQLSERVER uniqueidentifier not null default NEWID()

Bei Append oder Insert wird diese Default Funktion nicht ausgeführt, dann
beim Post Fehler "Feld muss einen Wert haben"

Danke für einen Tip

Uwe Raabe 11. Aug 2015 13:38

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Zitat:

Zitat von egentur (Beitrag 1311738)
Habe noch ein Problem.

Es gehört hier eigentlich zum guten Ton, daß für eine neue Frage ein neues Topic aufgemacht wird. Dann können sich auch diejenigen beteiligen, die mit dem ursprünglichen Titel nichts anfangen können.


Zitat:

Zitat von egentur (Beitrag 1311738)
Wie bringe ich ein TADQuery bei OnNewRecord dazu
den in der DB eingestellten Defaultwert für ein Feld zu nutzen

Mir ist aktuell keine Methode bekannt, mit der man an die Default-Werte des Servers herankommen kann. Es stellt sich hier aber auch die Frage, ob die Default-Werte für neue Datensätze bereits auf der Client-Seite bekannt sein müssen. Der Server wird schon für den korrekten Wert sorgen, wenn keiner da ist.

Zitat:

Zitat von egentur (Beitrag 1311738)
Habe ein ID Feld in Oracle RAW(16) not null default SYS_GUID() bzw.
in SQLSERVER uniqueidentifier not null default NEWID()

Bei Append oder Insert wird diese Default Funktion nicht ausgeführt, dann
beim Post Fehler "Feld muss einen Wert haben"

Das liegt daran, daß bei einem Feld mit NOT NULL clientseitig ein Wert erwartet wird (Required = true), aber die Default-Wert Eigenschaft nicht erkannt wird. Will man nun dem Server den Default-Wert vergeben lassen, muss aber nunmal ein NULL übergeben werden. Zur Vermeidung dieser Fehlermeldung setzt man das Required-Property des Feldes auf false.

Perlsau 11. Aug 2015 15:06

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Zitat:

Zitat von egentur (Beitrag 1311738)
Wie bringe ich ein TADQuery bei OnNewRecord dazu den in der DB eingestellten Defaultwert für ein Feld zu nutzen

Dazu gibt es mehrere Möglichkeiten:
  1. Du legst in der Datenbank für das jeweilige Feld der Tabelle einen Default-Wert fest. Dieser wird immer dann eingesetzt, wenn bei einem neuen Datensatz Null übergeben wird. Wenn ein Feld als Not Null deklariert und kein Default-Wert angegeben wurde, ist das fast immer problematisch.
  2. Du legst im AdoQuery den Defaultwert fest. Dazu gehst du in den Feldeditor (Rechtsklick auf Query-Komponente) und wählst dort das entsprechende Feld aus. Im Objektinspektor (OI) siehst du nun die Properties des gewählten Feldes. Dort trägst du unter DefaultExpression den gewünschten Defaultwert ein und setzt das Property Requiered auf True. Nun wird bei Übergabe von Null der hier eingetragene Defaultwert verwendet.
Welcher Eintrag nun Vorrang hat, der in der Datenbank oder der im OI, vermag ich nicht zu entscheiden.

Uwe Raabe 11. Aug 2015 15:27

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Zitat:

Zitat von Perlsau (Beitrag 1311840)
Welcher Eintrag nun Vorrang hat, der in der Datenbank oder der im OI, vermag ich nicht zu entscheiden.

DefaultExpression hat immer Vorrang vor dem Server-Wert, da dieser bereits vom Client eingetragen wird. Der Server sieht dann ja kein NULL mehr und darf also seinen Default-Wert nicht mehr eintragen.

Die Frage ging aber gerade darum, innerhalb des Clients den Default-Wert des Servers bei Anlegen eines neuen Datensatzes zu verwenden. Das mag notwendig sein, wenn dieser Wert noch vor dem Post gebraucht wird (z.B. für ein Calculated Field). Ich sehe nur bislang keine Möglichkeit, per FireDAC diesen Default-Wert vom Server (halbwegs automatisch) zu erfahren.

Wenn ich aber sowieso immer schon im Client den Default-Wert einsetze (der muss dann natürlich dort geflegt werden), brauche ich das Default im Server gar nicht erst einzurichten.

Perlsau 11. Aug 2015 15:31

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1311847)
Zitat:

Zitat von Perlsau (Beitrag 1311840)
Welcher Eintrag nun Vorrang hat, der in der Datenbank oder der im OI, vermag ich nicht zu entscheiden.

DefaultExpression hat immer Vorrang vor dem Server-Wert, da dieser bereits vom Client eingetragen wird. Der Server sieht dann ja kein NULL mehr und darf also seinen Default-Wert nicht mehr eintragen.

Das leuchtet direkt ohne Umwege ein :thumb:

egentur 11. Aug 2015 21:40

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Das war auch meine Absicht. Um halbwegs sequentielle GUIDs zu haben, nehme ich auf SQLServer Seite NEWSEQUENTIALID(), dies funktioniert aber nur als Defaultwert beim Server.

Die Anwendung greift "online" auf den SQL Server zu, legt dort Daten an welche dann auf den lokalen Rechner (mit Oracle XE) repliziert werden.
Im "offline" Modus können lokal auch Daten angelegt werden, die dann wieder mit dem SQL Server synchronisiert werden.

GUIDs als Schlüssel auf beiden Seiten. Da die Anzahl der lokalen Clients (mit Oracle) vorher nicht bekannt ist, ist das Verwalten von
verschiedenen Nummernkreisen doch recht aufwendig.

Hierbei muss ich aber die erzeugten Defaultwerte ( RAW(16) auf Oracle) (uniqueidentifier auf SQLSERVER) auslesen und als Verlinkung in andere Tabellen eintragen.
Wie greif ich hier nochmal die Daten ab ? DataSet.FieldByName('GUID').as ???

mkinzler 12. Aug 2015 05:09

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Warum verschiedene DBMS? Ich würde zur einfacheren Replikation lokal und remote das selbe System einsetzen.

Perlsau 12. Aug 2015 08:00

AW: GUID Feld von MSSQL nach Oracle und zurück
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von egentur (Beitrag 1311879)
Hierbei muss ich aber die erzeugten Defaultwerte ( RAW(16) auf Oracle) (uniqueidentifier auf SQLSERVER) auslesen und als Verlinkung in andere Tabellen eintragen. Wie greif ich hier nochmal die Daten ab ? DataSet.FieldByName('GUID').as ???

Wenn du die Defaultwerte bereits vor dem Posten benötigst und die Defaultwerte im jeweiligen Dataset (oder Query) in den jeweilgen Feld-Properties bereits festgelegt wurden, kannst du die doch einfach auslesen, oder etwa nicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 Uhr.
Seite 1 von 2  1 2      

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