12. februar 2002 - 16:41Der 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 *
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.
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.
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.
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
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?)
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.
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.
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
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.
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?
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');
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.
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)
Synes godt om
Ny brugerNybegynder
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.