AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Import aus Access plus ID > GUID
Thema durchsuchen
Ansicht
Themen-Optionen

Import aus Access plus ID > GUID

Ein Thema von manfred_h · begonnen am 7. Feb 2006 · letzter Beitrag vom 8. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#1

Import aus Access plus ID > GUID

  Alt 7. Feb 2006, 16:48
Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos
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.

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
Manfred
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#2

Re: Import aus Access plus ID > GUID

  Alt 8. Feb 2006, 11:37
Hat Irgendjemand eine Idee?

Manfred
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Import aus Access plus ID > GUID

  Alt 8. Feb 2006, 12:51
Hallo Manfred,

vielleicht möchtest du dir die Trial-Version der EMS DataPump for IB/FB laden und ausprobieren, was geht? Ich selbst habe leider keine Erfahrung mit diesem Tool, habe aber schon positive Kommentare registriert.

Grüße vom marabu
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#4

Re: Import aus Access plus ID > GUID

  Alt 8. Feb 2006, 13:02
Zitat von marabu:
Hallo Manfred,

vielleicht möchtest du dir die Trial-Version der EMS DataPump for IB/FB laden und ausprobieren, was geht? Ich selbst habe leider keine Erfahrung mit diesem Tool, habe aber schon positive Kommentare registriert.

Grüße vom marabu
Danke
werde es mir anschauen.

Manfred
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#5

Re: Import aus Access plus ID > GUID

  Alt 4. Mär 2006, 19:57
Hallo zusammen

habe es geschafft das ich die Daten der Access DB nach Firebird bekomme
wenn das jemand interessiert hier der Code ( Arbeite erst neu mit Delphi )

Delphi-Quellcode:
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;
nun kommt der schwirigere Teil ( für mich )
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Import aus Access plus ID > GUID

  Alt 5. Mär 2006, 09:36
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
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#7

Re: Import aus Access plus ID > GUID

  Alt 6. Mär 2006, 09:09
Zitat von marabu:
Hallo Manfred,

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
Hallo marabu

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:
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;
2. hier soll eine "schleife" gestartet werden und die Variablen old_id / new_id
Delphi-Quellcode:
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
3. hier soll dem Feld ID in NursingH eine GUID zugeteilt werden und die gleiche in ( das momentan auskommentierte Feld ) NursingH_D ID_AREA:
Delphi-Quellcode:
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;
Nach meiner Meinung liegt im 3. das Problem.
Kanst Du mir sagen ob meine Überlegung richtig ist?
Wenn ich mit new_id:= CreateClassID; eine Variable erstelle und diese dann 2x Verwende nimmt er dann die
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Import aus Access plus ID > GUID

  Alt 6. Mär 2006, 10:29
Hallo Manfred,

Zitat von manfred_h:
Die Theorie ist mir eigentlich klar, nur die umsetzung hapert noch.
ist dir bewusst, dass ein GUID eine segmentierte 128-bit Zahl ist, die als Zeichenkette der Länge 38 repräsentiert wird?

Code:
'{00000002-0000-0000-C000-000000000046}'
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.

Grüße vom marabu
  Mit Zitat antworten Zitat
manfred_h

Registriert seit: 4. Nov 2005
Ort: Basel
442 Beiträge
 
Delphi XE2 Enterprise
 
#9

Re: Import aus Access plus ID > GUID

  Alt 6. Mär 2006, 23:21
Zitat von marabu:
Hallo Manfred,

Zitat von manfred_h:
Die Theorie ist mir eigentlich klar, nur die umsetzung hapert noch.
ist dir bewusst, dass ein GUID eine segmentierte 128-bit Zahl ist, die als Zeichenkette der Länge 38 repräsentiert wird?

Code:
'{00000002-0000-0000-C000-000000000046}'
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.
Hallo Marabu
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:
GUID in Firebird und die Geschwindikeit

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 )

Manfred
( PS: Die längere Antwortzeit soll wirklich kein Zeichen für Desinteresse sein )

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;**/
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Import aus Access plus ID > GUID

  Alt 7. Mär 2006, 06:32
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 14:56 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