Avatar billede angelod Novice
12. februar 2002 - 16:41 Der er 34 kommentarer og
1 løsning

Merge 2 databaser

Jeg har en såkaldt "main database" som indeholder alle data. Det skal være muligt at eksportere hele databasen, eller blot dele af den, hvilket er nemt nok. Problemet består i at importere igen.. Det tager al for lang tid at importere..

Er der en hurtig måde at merge 2 Access databaser i et program?

Det skal lige nævnes at jeg benytter DeerSoft's ADO kontroller, som skulle være beslægtede med BDE kontrollerne i Delphi. Og min version af Delphi er 4.

Håber der er en Ekspert som kan hjælpe. *kigger forventningsfuldt på Stoney :D *
Avatar billede stoney Nybegynder
12. februar 2002 - 19:06 #1
Hej Angelod

Hvad er det du vil helt nøjagtigt ?
Vil du tage data fra database1 og ligge ind i database2 ?
Er tabelnavne forskellige i hver database ?
Hvis ikke skal tabeller med unik id skal de så overskrives eller hvilken tabel gælder hvis de ikke skal ? (meget grimt hvis du kører med primary index)
Jeg går ud fra det kun er tabeller du vil merge/importer.
Jeg er først tilbage ca. kl. 20:30.
Men lige udmiddelbart vil jeg tro du kan klare det med noget SQL
a la select * from tabel1 into tabel2

Jeg er ikke helt sikker, men jeg kigger på det senere i aften.

See you

Stoney
Avatar billede angelod Novice
12. februar 2002 - 19:53 #2
Tabelnavnene er ens.
Der er 3 tabeller: Tapes, Clips og Customers
Tapes indeholder informationer om bånd, mens Clips indeholder informationer om hvert af de klip der er på båndene, og Customers indeholder info om kunder.

I øjeblikket er der unikt ID for alle dele. Ved Tapes skal der overskrives i tilfælde af 2 ens ID. Derimod benytter Clips og Customers autonummerering lige nu.. Dette kan dog ændres til at blive et unikt ID hvis dette er nødvendigt for hurtigere opdatering.
Avatar billede angelod Novice
12. februar 2002 - 22:40 #3
Hvaaaa.. Er du tilbage, stoney? Klokken har efterhånden passeret 22:30.
Avatar billede stoney Nybegynder
12. februar 2002 - 22:59 #4
ja Ja

Jeg sidder lige og roder med det.
Indtil videre er det lykkedes mig at få den til at overføre alt fra
database1 tapes -> database2 tapes.

Jeg skal bare lige finde ud af hvordan jeg får den til kun at updatere
hvis en id findes i forvejen.

Be patient

Stoney
Avatar billede stoney Nybegynder
12. februar 2002 - 23:07 #5
Forresten nu du siger det tager lang tid at importere, hvor stor er dine databaser i MB og antal records ?

Bare så jeg har lidt at sammenligne med !!

Stoney
Avatar billede angelod Novice
12. februar 2002 - 23:31 #6
Tjoh.. Lad mig nu se..

Filstørrelse: ~9 MB

Tapes: ~75
Clips: ~500 per Tape
Customers: ~100
Avatar billede angelod Novice
12. februar 2002 - 23:34 #7
Forresten skal den opdatere hvis der findes ID i forvejen, og tilføje hvis båndet ikke eksisterer.

Clips og Customers er lidt tricky.. Måske jeg sku lave unikke ID for disse tabeller også? Altså istedet for at benytte autonummerering..
Avatar billede stoney Nybegynder
12. februar 2002 - 23:42 #8
hvor lang tid er du om at importere.
Jeg sidder og leger med 1-2 millioner records (jeg har godt nok kun 2 kolonner i min tabel jeg tester med)

Filstørrelse ca 62,5 MB
2.163.000 records

Stoney
Avatar billede angelod Novice
13. februar 2002 - 00:04 #9
Efter et par minutter havde den kun importeret 75 bånd, 1700 klip og ingen kunder.
Avatar billede stoney Nybegynder
13. februar 2002 - 01:56 #10
He He
Det er en grim opgave du har fået der Angelod.
Klokken er mange, jeg må i seng nu.
Men jeg er vist meget tæt på en løsning.
Jeg vender tilbage i morgen aften, efter arbejde. (ca. 18:00)
Nu er der gået sport i at få det løst.

Stoney
Avatar billede angelod Novice
13. februar 2002 - 02:06 #11
Hæhæ. Hvis du får løst den fordobler jeg sgu pointene. :o)
Avatar billede angelod Novice
13. februar 2002 - 20:02 #12
Har du fået kigget mere på det? :o)
Avatar billede stoney Nybegynder
13. februar 2002 - 20:08 #13
Jeg sidder og kigger på det nu.

Stoney
Avatar billede angelod Novice
13. februar 2002 - 20:09 #14
Lækkert. Jeg håber sgu det lykkedes. :o)
Avatar billede stoney Nybegynder
13. februar 2002 - 22:03 #15
I'm going nuts.
Det er lidt sværere end jeg troede.
Det kan jo være du selv kan hjælpe, hvis jeg har stirret mig blind på et eller andet.

Følgende query overfører/kopier alt fra db1.mdb tapes til db2.mdb tapes.
Jeg har brugt 2 connection ( 1 til hver .MDB)
Jeg kan ikke få den til at sammenligne felt værdier i de 2 tabeller.

procedure TForm1.Button3Click(Sender: TObject);
begin
with adoquerytapovf do  begin
with SQL do begin
    Clear;

      // overfører alt fra db1 tapes til db2 tapes
   
      add('INSERT INTO [tapes] in db2.mdb  SELECT * FROM [tapes] IN db1.mdb');
       
//-----------------------------------------
// Her skal være noget a ala  add('where ???????????
//Det er her det går galt for mig. Jeg kan ikke lige overskue syntaksen
//for at sammenligne felt værdier i 2 .MDB filer

//----------------------------------------


  end;
  adoquerytapovf.ExecSQL;
       
  end;

  end;

Måske du har et par friske øjne til at se på det.

Stoney
Avatar billede angelod Novice
13. februar 2002 - 22:14 #16
Når den kopierer alt ind, så overskriver den vel de poster der er der i forvejen, og tilføjer dem der ikke er der?

Hvis dette er tilfældet, så er det helt fint, da det er det den skal. Spørgsmålet er blot hvor hurtigt dette sker? (Og nu hvor jeg er i gang med det, hvordan oprettede du den store database, og på hvor lang tid?)
Avatar billede stoney Nybegynder
13. februar 2002 - 22:23 #17
Nej, det er nemlig det den ikke gør. Den tilføjer dem bare i tabellen.
Det er det der er mit problem.
Men det går svine hurtigt.

Den store tabel lavede jeg med ovenstående kode, med en lille ændring
add('INSERT INTO [tapes] in db2.mdb  SELECT * FROM [tapes] IN db2.mdb');
                                                              obs
                                                              obs

Kig over obs db = db2.mdb

Det den gør er at vælge alt i db og indsætte det. Altså den dobbler bare records up. Den query skød jeg af nogle gange indtil jeg havde pænt magen records.

Stoney
Avatar billede stoney Nybegynder
13. februar 2002 - 22:33 #18
Forresten den query jeg brugte er hooked op mod db2.mdb

Stoney
Avatar billede angelod Novice
13. februar 2002 - 23:02 #19
Vil den også blot tilføje hvis nøglen er sat til NoDuplicates?
Avatar billede stoney Nybegynder
13. februar 2002 - 23:09 #20
Hvis der er dubletter overfører ingen overhovedet.

Vi skal nok få det løst, det er ike sikkert det lige bliver i aften, men løst det bliver det.

Stoney
Avatar billede stoney Nybegynder
13. februar 2002 - 23:13 #21
Har du prøvet at indsætte mange records af gangen.
Går det ikke meget hurigere en Acces selv kan klare.

Stoney
Avatar billede angelod Novice
14. februar 2002 - 00:02 #22
Nu er jeg ikke lige klar over hvor hurtigt Access kan klare det, men da jeg skrev en mindre funktion til at tilføje meget til databasen tog det omkring en time at tilføje 73 bånd, 36.300 klip, og 100 kunder.
Avatar billede stoney Nybegynder
14. februar 2002 - 00:12 #23
Du bruger TQuery og ikke TTable, ikke sandt.

Der er væsentlig forskel i performance.

Stoney
Avatar billede angelod Novice
14. februar 2002 - 01:20 #24
Nej jeg bruger nu TTable da jeg ikke kan finde ud af SQL syntaksen. Jeg troede den var magen til MySQLs syntaks, men nej nej.
Avatar billede stoney Nybegynder
14. februar 2002 - 15:05 #25
Hej angelod

Kan du ikke prøve at sende mig en tom kopi af din database.

sh@tradestone.dk

Stoney
Avatar billede angelod Novice
14. februar 2002 - 18:47 #26
Er du kommet nærmere en løsning?

Og hvis du sendte en email tilbage så tror jeg at jeg kom til at sende fra den forkerte adresse.. Den rigtige er tbe@zeusmedia.dk hvorimod jeg tror du fik den der hedder design@zeusmedia.dk
Avatar billede stoney Nybegynder
14. februar 2002 - 23:06 #27
Kommentar fra angelod
14/02-2002 00:02:17

Nu er jeg ikke lige klar over hvor hurtigt Access kan klare det, men da jeg skrev en mindre funktion til at tilføje meget til databasen tog det omkring en time at tilføje 73 bånd, 36.300 klip, og 100 kunder.
----------------------------------------------------------------

Indeholder dit memofelt meget tekst for jeg kan indsætte 131.000
records på ca. 45 sekunder.

Altså kun i 1 tabel.

Stoney
Avatar billede angelod Novice
14. februar 2002 - 23:41 #28
Næh.. I testen var der ca. 50 tegn i memofelterne.

Jeg brugte TTable, men hvis det er kan jeg godt benytte TQuery, jeg kan bare ikke finde ud af den syntaks der er gældende for ADO SQL engine. Har du noget info, eller er det i hjælpefilen et eller andet sted og så kan jeg bare ikke finde det?
Avatar billede stoney Nybegynder
15. februar 2002 - 00:14 #29
Er det SQL i Delphi du ikke kan finde ud af ?

Ellers kig i localsql.hlp
----------------------------------
Nedenstående eks. bruger 2 .mdb filer cs.mdb og cs2.mdb (den du sendte mig)
Prøv at lave et nyt project hvor du dropper 2 adoconnection 2 datasouce og 1 adoquery.
Hver connection skal pege på hver sin .mdb fil
Sæt din query op mod den .mdb der skal kopiers/indsættes til
(i mit eks. cs2.mdb)
Erstat adoquerytapovf med dit query navn
Herefter får du kopieret alle records i tapes fra cs.mdb til cs2.mdb
Det skulle gerne gå rimeligt hurtigt.

procedure TForm1.Button1Click(Sender: TObject);
begin
with adoquerytapovf do  begin
with SQL do begin
    Clear;
 
         
      // overfører alt fra cs.mdb tapes til cs2.mdb tapes
      add('INSERT INTO tapes SELECT * FROM [tapes] IN cs.mdb');


  end;
  adoquerytapovf.ExecSQL;
       
     
  end;

Stoney
Avatar billede angelod Novice
15. februar 2002 - 00:30 #30
Vil den overskrive og tilføje som den skal?
Avatar billede stoney Nybegynder
15. februar 2002 - 00:38 #31
Nej, det mangler jeg stadig at finde ud af.
Det var bare for at teste hvor hurtigt det går med "live" data.
Husk at tage backup inden du gør det.

Stoney
Avatar billede angelod Novice
15. februar 2002 - 00:45 #32
Jeg kan ikke få det til at virke.. Jeg bruger jo ikke standard ADO komponenter da de ikke eksisterer i Delphi4. Jeg har 4 komponenter der er relateret til ADO: DMaster, DTable, DQuery og DUpdateSQL

Det var de komponenter fra DeerSoft du sendte mig et link til i et tidligere spørgsmål.
Avatar billede angelod Novice
17. februar 2002 - 23:03 #33
Nåh skidt, jeg bruger en nødløsning.
Smid et svar ind, så får du de 30 point fordi du i det mindste prøvede. :o)
Avatar billede stoney Nybegynder
18. februar 2002 - 11:09 #34
Hej Angelod

Jeg har ikke glemt indlægget.

Jeg vil prøve med DeerSoft komponenterne.
Problemet er bare jeg kører D6, så jeg kan ikke maile dig et project
du kan bruge til noget.

Hvad bruger egentlig som nødløsning ?

Stoney
Avatar billede angelod Novice
18. februar 2002 - 13:14 #35
Jeg giver brugeren mulighed for at vælge om de vil gendanne fra backup (hvilket jo bare er at kopiere filen), eller inkludere enkelte posteringer (hvilket er det de hyppigst vil få brug for i dette software). :o)

Jeg ville ønske det måtte køre på nettet, så kunne jeg have benyttet en MySQL server, eller noget lignende. :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester