11. februar 2008 - 14:18Der er
20 kommentarer og 1 løsning
Gemme data på mySQL server hentet fra Paradox fil
Først vil jeg starte med at sige at jeg ikke er nogen haj til Delphi - mit område er Microsoft Access VBA som jeg så til gengæld er god til.
Min opgave: Jeg har en hel flok Paradox filer som jeg gerne vil samle i en tabel på en mySQL server. Jeg kan godt finde ud af at få alle filerne fundet i det directory hvor de nu skal være. Jeg lister dem så ind i en listbox(skal bruges senere) Jeg kan så loope disse filer 1 efter 1, men jeg skal så have indholdet sendt op på en mySQL server i en bestemt tabel der er layoutet på samme måde som Paradox filerne.
Hvis der er tale om en helt identisk tabelstruktur er det simpelt. Hvis MSSQL tabellernes primrnøgler nu er af typen identity bliver det mere problematisk.
1. Sorter paradoxtabellerne så de vigtigste kommer først (de tabeller som andre tabeller har en fremmednøgle til) 2. Lav en TQuery der "selecter" data fra paradox 3. Lav en TADOQuery der "inserter" i MSSQL. 4. Læs linje, kopiér data over i TADOQuery, udfør, gentag indtil slut
Hastigheden kan sættes op om du pakker transaktioner omkring dit "insert loop".
Det gentages for hver enkelt tabel
Det svære begynder hvis der genereres nye primærnøgler på MSSQL-siden. Gør der det?
Overså det var MySQL. Er primærnøglen der AutoInc? Hvad bruger du af databasekomponenter til MySQL?
Du skriver "Jeg har en hel flok Paradox filer som jeg gerne vil samle i en tabel på en mySQL server.". Mener du "Jeg skal portere en PDOX-database til MySQL"? Det er dit brug af "tabel" hvor jeg tror du mener "database".
Det er en flok identiske filer (etellerandet.db) hvor der er samlet data op på forskellige lokationer. De hentes 'hjem' og så vil jeg lave noget automatik der looper disse filer(består af 1 tabel) og så overføre data til en mySQL (eller noget andet) og så lave noget statestik på disse data. Der er op til et par hundrede filer som gerne skulle køres igennem i hvert fald 1 gang om ugen. Normalt ville jeg jo lave en ny key på destinationstabellen der gør at hvis de samme data forsøges indsat, så kommer der en fejl som kan fanges så recorden bare skippes. Det gør nemlig at jeg ikke behøver at tømme tabellen før start og jeg behøver ikke bekymre mig om dubletter.
11/02-2008 14:59:00 kan principielt også bruges Paradox->MySQL.
Men hvor mange tabeller er der ? Hvis der ikke er vildt mange, så var det måske nemmere at gå ind i Access og linke både Paradox og MySQL og så copy paste lidt manuelt fremfor at kode det i Delphi.
hrc> det var det helt rigtige udtryk - datafangst. tabellen indeholder 13 talværdier, 1 alfanumerisk og et datofelt
arne_v> der er 1 tabel pr. fil, men der er som sagt op til et par hundrede filer der skal køres igennem i hvert fald 1 gang pr. uge. Så selv om jeg gerne ville, så vil jeg påstå at Access ikke er det rigtige valg til denne opgave. (jeg har heller aldrig faldet over en driver til MySQL som jeg synes fungerer optimalt. Jeg har prøvet et par stykker for år tilbage og de duede i hvertfald ikke.(og nej jeg husker desværre ikke hvad de hed :-) )
Har nu fundet ud af så meget at jeg har lavet det så alle tabeller bliver vist i et dbgrid 1 ad gangen, men så skal jeg jo have dem smidt der fra og så over i noget andet.
Principielt er det mig ligegyldigt om det er MySQL eller Access da vider behandling kommer til at ske via et webinterface.
Hvad er så problemet? :-) ... udover at du skal gennem BDE'en. Mener at stieen til en Paradox-tabel kan du angive direkte i TTablen.
Jeg vil klart foretrække at tømme tabellerne efter data er ført over i MySQL (som i øvrigt er blevet købt af Sun). Det er lettest sådan.
Altså lav et bde-alias til der tabellerne ligger. Den sti kan du eventuelt sætte op som et temporært alias eller du kan gøre det via bdeadmin. Via en TSession (der er en aktiv pr. default) kan du nu processere hver enkelt tabel ved simpelthen at løbe en listen af tabeller igennem
Noget i retning af dette:
procedure TForm1.btnOverfoerClick(Sender: TObject); var i: integer; Table: TTable; // Paradox Query: TSQLQuery; // MySql; List: TStringList; begin List := TStringList.Create; Query := TSQLQuery.Create(nil); try Session.GetTableNames('dit_alias','*.db',true,false,List); // Sæt op Query her Query.SQL.Text := 'insert into fangst (dato, maaler, temperatur) values (:dato, :maaler, :temperatur)';
for i := 0 to List.Count - 1 do begin Table := TTable.Create(nil); // En smagssag om man skal oprette eller genbruge try Table.DatabaseName := 'dit_alias'; Table.TableName := List[i];
Table.Open; try while not Table.Eof do begin Query.ParamByName('dato').Assign(Table.FieldByName('dato')); Query.ParamByName('maaler').AsString := List[i]; // Eller andet ID Query.ParamByName('temperatur').Assign(Table.FieldByName('temperatur')); Query.ExecSQL;
Så har jeg fået flikket noget sammen som ser ud til at virke ud fra din opskrift hrc + nogle små detaljer hentet på nettet.
Det eneste irritationsmoment nu er at jeg skal angive password til MySQL serveren og til den første Paradox tabel jeg læser fra. Når det er gjort ser det ud til at blive gemt så længe programmet kører.
Hvis du forbinder via en database-komponent kan du slå login-dialogen fra og angive oplysningerne enten i din loginstreng eller i en dialog der popper op hvis du dobbeltklikker på den.
Lige nu er mit største problem dog at der ikke er konsistens i layoutet at databasefilerne (Paradox) Der er et par stykker der ikke indeholder de samme felter som resten, så jeg skal have fundet ud af at lave noget errortrapping på det så jeg blot kan springe de filer over og evt. lave en entry i den logfil jeg skriver til under konverteringen.
hrc> du har vel ikke et eksempel på det med at angive password? Jeg kan ikke lige gennemskue den. Jeg har arbejdet med M$ Access nu i ca. 15 år, og det gør altså at der er nogle ting der ikke virker helt logiske når man lige pludselig bliver smidt ud i at skulle bruge Delphi til at lave databaseopgaver :-)
Hugo: Du kan smide en (camoufleret) email her, så skal jeg sende hvad jeg har brygget sammen. Det er et program bestående af en form og et datamodule hvor sidstnævnte indeholder det meste logik. Umiddelbart tror jeg kun du skal tilrette det lidt før det virker med dine databaser. Koden er lavet i D2006 men burde kunne indlæses i ældre versioner.
Jeg fandt en løsning på problemet med password til Paradox - der er noget der hedder en Session og der kan man sætte et password på som den så bruger. Om det er den rigtig metode eller ej ved jeg ikke, men det fungerer.
Jeg bruger en TDataSource og en TQuery for at få fat på data i Paradox. Så skifter jeg bare databasen på TDataSource hele tiden når jeg skal læse en ny tabel. Det virker men det tager lidt tid at hente alle de mange 100.000 records der ligger.
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.