AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken GUID Feld von MSSQL nach Oracle und zurück

GUID Feld von MSSQL nach Oracle und zurück

Ein Thema von egentur · begonnen am 7. Aug 2015 · letzter Beitrag vom 12. Aug 2015
Antwort Antwort
Seite 1 von 2  1 2   
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

GUID Feld von MSSQL nach Oracle und zurück

  Alt 7. Aug 2015, 17:20
Datenbank: SQLServer • Version: 2014 • Zugriff über: AnyDAC
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

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

  Alt 7. Aug 2015, 17:34
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 SizeOf(TGUID) herauskommt (16 Bytes?) dann kann man aus dem Record direkt eine Bytefolge erstellen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

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

  Alt 11. Aug 2015, 00:48
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
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 11. Aug 2015, 14:38
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.


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.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#5

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

  Alt 11. Aug 2015, 16:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 11. Aug 2015, 16:27
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#7

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

  Alt 11. Aug 2015, 16:31
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
  Mit Zitat antworten Zitat
egentur

Registriert seit: 27. Sep 2006
Ort: Freising
60 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

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

  Alt 11. Aug 2015, 22:40
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 ???
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 12. Aug 2015, 06:09
Warum verschiedene DBMS? Ich würde zur einfacheren Replikation lokal und remote das selbe System einsetzen.
Markus Kinzler
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

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

  Alt 12. Aug 2015, 09:00
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?
Miniaturansicht angehängter Grafiken
queryfielddefaultexpression.jpg  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 08:21 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