![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos
Import aus Access plus ID > GUID
Hallo zusammen
hab da ein Problem: Aus einer bestehenden Access DB Anwendung muss ich verknüpfte Daten importieren und zusätzlich noch von einer "normalen" ID auf eine GUID wechseln. Bin da ein wenig ratlos. :pale: Tabelle1 Tabelle2 ID ID Name ID_Sparte > Tabelle1 Details habe nun schon länger in diversen Foren usw. gesucht aber nichts gefunden. Datapump wurde des öfteren erwähnt aber in meiner Delphi 2006 habe ich das Tool nicht gefunden. Auch weiss ich nicht ob das mit dem umstellen auf die GUID mit diesem Tool irgendwie machbar ist. Bin echt dankbar auf Eure Infos :sharkylinchen: Manfred |
Re: Import aus Access plus ID > GUID
:cat: Hat Irgendjemand eine Idee?
Manfred |
Re: Import aus Access plus ID > GUID
Hallo Manfred,
vielleicht möchtest du dir die Trial-Version der ![]() Grüße vom marabu |
Re: Import aus Access plus ID > GUID
Zitat:
werde es mir anschauen. Manfred |
Re: Import aus Access plus ID > GUID
Hallo zusammen
habe es geschafft das ich die Daten der Access DB nach Firebird bekomme :coder: wenn das jemand interessiert hier der Code ( Arbeite erst neu mit Delphi )
Delphi-Quellcode:
nun kommt der schwirigere Teil ( für mich )
procedure Tfrm_tools.TntButton1Click(Sender: TObject);
begin DM.ADOC_nursh_imp.Open(); DM.ADOT_nursh_imp.TableName:='altersheim'; DM.pFIBDB_Gideons.Connected := True; DM.pFIBDS_NursingH.Open; if not DM.pFIBDS_Camps.Active then DM.pFIBDS_Camps.Open; try DM.ADOT_nursh_imp.First; for i := 0 to DM.ADOT_nursh_imp.RecordCount -1 do begin DM.pFIBDS_NursingH.Insert; DM.pFIBDS_NursingH.FieldByName('ID').AsString := DM.ADOT_nursh_imp.FieldByName('ID').AsString; DM.pFIBDS_NursingH.FieldByName('C_NR').AsString := DM.ADOT_nursh_imp.FieldByName('G_Nr').AsString; DM.pFIBDS_NursingH.FieldByName('U_NR').AsString := DM.ADOT_nursh_imp.FieldByName('U_Nr').AsString; DM.pFIBDS_NursingH.FieldByName('NAME').AsString := DM.ADOT_nursh_imp.FieldByName('Name').AsString; DM.pFIBDS_NursingH.FieldByName('STR').AsString := DM.ADOT_nursh_imp.FieldByName('Strasse').AsString; DM.pFIBDS_NursingH.FieldByName('PLZ').AsString := DM.ADOT_nursh_imp.FieldByName('PLZ').AsString; DM.pFIBDS_NursingH.Post; DM.ADOT_nursh_imp.Next; end; finally DM.pFIBDS_NursingH.Active := false; DM.ADOT_nursh_imp.Active := false; end; end; ich möchte die ID aus Access mit einer GUID ersetzten inkl. in den Verknüpften Tabellen. Fals mir hier jemand ein wenig auf die Sprünge helfen kann. hier der Code an dem ich rumprobiere ( teile habe ich Testweise ausgeklammert )
Delphi-Quellcode:
:?
procedure Tfrm_tools.btn_idreplClick(Sender: TObject);
begin DM.pFIBDB_Gideons.Connected := True; DM.pFIBDS_NursingH.Open; // DM.pFIBDS_NursingH_D.Open; // DM.pFIBDS_NursingH_DD.Open; if not DM.pFIBDS_Camps.Active then DM.pFIBDS_Camps.Open; try DM.ADOT_nursh_imp.First; for i := 0 to DM.ADOT_nursh_imp.RecordCount -1 do begin old_id:= Dm.pFIBDS_NursingH.FieldByName('ID').AsInteger; new_id:= CreateClassID; //new_id:= StringReplace(old_id,(''+(CreateClassID)) [rfReplaceAll, rfIgnoreCase]); // SELECT NURSING_H_D.ID_AREA FROM NURSING_H_D WHERE ID_AREA = 25 DM.pFIBDS_NursingH.Edit; DM.pFIBDS_NursingH.FieldByName('ID').AsString := new_id; DM.pFIBDS_NursingH.Post; //DM.pFIBDS_NursingH_D.FieldByFieldNo(old_id); //DM.pFIBDS_NursingH_D.Insert; //DM.pFIBDS_NursingH_D.FieldByName('ID_AREA').AsString:= new_id; //DM.pFIBDS_NursingH_D.Post; DM.ADOT_nursh_imp.Next; end; finally // DM.pFIBDS_NursingH.Active := false; // DM.ADOT_nursh_imp.Active := false; end; end; Manfred |
Re: Import aus Access plus ID > GUID
Hallo Manfred,
vor zwei Wochen habe ich mehrere schema-kompatible Datenbanken (MSSQL7) von Kunden-Lokationen abgezogen und in unserer Serverfarm zu einer einzigen Datenbank (MSSQL2K) aggregiert. Dabei musste ich natürlich auch eine Schlüsseltransformation durchführen. Ich habe alles per SQL über die Konsole erledigt. Dazu habe ich jeder Tabelle für jeden Schlüssel (PK, FK) ein neues Schlüsselfeld (und jeweils ein Sicherungsfeld zur Aufnahme des Originalwertes) zur Seite gestellt. Als nächstes habe ich die alten Schlüssselwerte in die Sicherungsfelder übertragen, damit ich jederzeit den Ausgangszustand wieder herstellen konnte. Bei mir waren die neuen Schlüsselfelder Identity-Felder, die vom Server automatisch durchnummeriert werden, bei dir sollen es GUID-Felder sein. Ich denke, für so eine einmalige Aufgabe muss nicht unbedingt ein Programm erstellt werden. Ein paar ALTER TABLE und UPDATE Statements tun da auch ihren Zweck. Grüße vom marabu |
Re: Import aus Access plus ID > GUID
Zitat:
bei einer einzelnen DB hast Du natürlich recht. Da ich aber vor ca. 1/2 Jahr schon eine DB frtiggestellt habe die nun von einigen Leutet ( weiss nicht wie viel, da das Programm "frei" ist ) eingesetzt wird. Muss ich eine Importfunktion in meiner neuen DB haben. :| Wie Du dem Code sichrlich entnehmen kannst binn ich mir nicht ganz sicher auf welchem Wege ich das bewerkstelligen kann / soll. Die Theorie ist mir eigentlich klar, nur die umsetzung hapert noch. Womöglich kannst Du mir einen Tippp geben ob ich was vergesse oder falsch mache? 1. mit dem stelle ich die Verbindung zur Datenbank her:
Delphi-Quellcode:
2. hier soll eine "schleife" gestartet werden und die Variablen old_id / new_id
DM.pFIBDB_Gideons.Connected := True;
DM.pFIBDS_NursingH.Open; // DM.pFIBDS_NursingH_D.Open; // DM.pFIBDS_NursingH_DD.Open; if not DM.pFIBDS_Camps.Active then DM.pFIBDS_Camps.Open;
Delphi-Quellcode:
3. hier soll dem Feld ID in NursingH eine GUID zugeteilt werden und die gleiche in ( das momentan auskommentierte Feld ) NursingH_D ID_AREA:
try
DM.ADOT_nursh_imp.First; for i := 0 to DM.ADOT_nursh_imp.RecordCount -1 do begin old_id:= Dm.pFIBDS_NursingH.FieldByName('ID').AsInteger; new_id:= CreateClassID; //new_id:= StringReplace(old_id,(''+(CreateClassID)) [rfReplaceAll, rfIgnoreCase]); // SELECT NURSING_H_D.ID_AREA FROM NURSING_H_D WHERE ID_AREA = 25
Delphi-Quellcode:
Nach meiner Meinung liegt im 3. das Problem.
DM.pFIBDS_NursingH.Edit;
DM.pFIBDS_NursingH.FieldByName('ID').AsString := new_id; DM.pFIBDS_NursingH.Post; //DM.pFIBDS_NursingH_D.FieldByFieldNo(old_id); //DM.pFIBDS_NursingH_D.Insert; //DM.pFIBDS_NursingH_D.FieldByName('ID_AREA').AsString:= new_id; //DM.pFIBDS_NursingH_D.Post; DM.ADOT_nursh_imp.Next; Kanst Du mir sagen ob meine Überlegung richtig ist? Wenn ich mit
Delphi-Quellcode:
eine Variable erstelle und diese dann 2x Verwende nimmt er dann die
new_id:= CreateClassID;
gleiche GUID? Bei der ausführung des obigen Codes erhalte ich immer die Meldung: " is not a Valid integer value Kannst Du mir hier weiterhelfen? Manfred |
Re: Import aus Access plus ID > GUID
Hallo Manfred,
Zitat:
Code:
Solange dein RDBMS keine 128-bit Zahlen speichern kann, musst du sehr genau überlegen, ob du auf die performanten 32-bit Schlüssel verzichten kannst. Da ich dein DB-Schema nicht kenne, kann ich schlecht beurteilen, ob du mit den GUID-Schlüsseln eine gute Entscheidung triffst oder nicht. Meine Erfahrung sagt mir aber - eher nicht.
'{00000002-0000-0000-C000-000000000046}'
Grüße vom marabu |
Re: Import aus Access plus ID > GUID
Zitat:
danke schon mal für die Antwort. Als DB setzte ich Firebird in der Version 1.5 mit den FibPlus-Komponenten ein. In den Infos zu FibPlus wird speziell erwähnt das diese auch GUID's unterstüzen und da dieselben nur für Firebird sind ( meines Wissens ) sollte das doch gehen. :| Die Frage der Geschwindigkeit habe ich hier im Forum schon mal gestellt und diese Antort bekommen: ![]() Die Entscheidung mit den GUID's habe ich getroffen weil die Anwendung von mehreren ( >100 ) Personen genutzt wird, die die Daten über das Internet abgleichen müssen ( miteinander ). Die Anzahl der Benuzter darf nich beschränkt sein. Aber jeder einzelene Benutzer hat nicht den Zugriff auf alle Daten, nur für die aus seiner Region. (Daher is die Anzahl der Datensätze normalerweise niicht so hoch ) Aus etlichen Foren / Dokus bin ich dann zum schluss gekommen das das mit einer GUID möglich währe. ( Bin aber immer gerne Lernbereit ) :balloon: Manfred ( PS: Die längere Antwortzeit soll wirklich kein Zeichen für Desinteresse sein :hi: ) mein DB schema sieht wie folgt aus ( ein Auszug )
SQL-Code:
/******************************************************************************/
/**** DOMAINS START ****/ /******************************************************************************/ CREATE DOMAIN "ID" AS CHAR(38) CHARACTER SET ISO8859_1 NOT NULL; CREATE DOMAIN "PLZ" AS VARCHAR(10) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "STATUS" AS VARCHAR(10) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "T10" AS VARCHAR(10) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "T20" AS VARCHAR(20) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "T30" AS VARCHAR(30) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "T50" AS VARCHAR(50) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "T70" AS VARCHAR(50) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "T130" AS VARCHAR(130) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "T255" AS VARCHAR(255) CHARACTER SET UNICODE_FSS; CREATE DOMAIN "DATE" AS DATE; CREATE DOMAIN "TIME_S" AS TIMESTAMP; CREATE DOMAIN "I_O" AS DECIMAL(9, 0); CREATE DOMAIN "TEXT" AS BLOB SUB_TYPE 2 SEGMENT SIZE 4096; /******************************************************************************/ /**** ALTERSHEIM Start ****/ /**** NURSING HOME Start ****/ /******************************************************************************/ CREATE TABLE NURSING_H ( "ID" "ID", "C_NR" "T30" NOT NULL, "U_NR" "T30" NOT NULL, "NAME" "T130", "STR" "T130", "PLZ" "PLZ", "CITY" "T50", "TEL" "T20", "FAX" "T20", "EMAIL" "T50", "HOMEPAGE" "T130", "ANZ_PL" "T10", "WORKER" INTEGER, "MT" SMALLINT, "ACCEPTANCE" INTEGER, "STATUS" INTEGER, "MEMO" "TEXT", "NC" INTEGER, "CS" INTEGER, "L_UPDATE" "TIME_S", "STAT_UPDATE" INTEGER, "STAT_DEL" INTEGER ); /******************************************************************************/ /**** Primary Keys ****/ /******************************************************************************/ ALTER TABLE NURSING_H ADD PRIMARY KEY (ID); ALTER TABLE NURSING_H ADD FOREIGN KEY ("C_NR") REFERENCES CAMPS ("C_NR") ON UPDATE CASCADE; /**ALTER TABLE NURSING_H ADD FOREIGN KEY ("U_NR") REFERENCES CAMPS ("U_NR") ON UPDATE CASCADE;**/ |
Re: Import aus Access plus ID > GUID
Hai Manfred,
hier mal eine kurzes Beispiel wie ich es bei zwei Tabellen machen würde. Hierbei ist in Tabelle2 das Feld tabelle1_id der ForenKey auf die ID von Tabelle1.
Delphi-Quellcode:
uses
ActiveX, ComObj; function Neue_GuID: String; var guidWork: TGUID; begin CoCreateGuid(guidWork); Result := GUIDToString(guidWork); end; procedure Tib.Button1Click(Sender: TObject); var oldID: string; newID: string; begin Query2.Close; Query2.SQL.Text := 'UPDATE tabelle2 SET tabelle1_id = :newID WHERE id = :oldID'; Query2.ParamCheck := True; Query1.Close; Query1.SQL.Text := 'SELECT id FROM tabelle1'; Query1.Open; while not (Query1.Eof) do begin newID := Neue_GuID; oldID := Query1.FieldByName('id').AsString; Query1.Edit; Query1.FieldByName('id').AsString := newID; Query2.ParamByName('newID').AsString := newID; Query2.ParamByName('oldID').AsString := oldID; Query2.ExecSQL; Query1.Next; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz