Avatar billede hugopedersen Nybegynder
11. februar 2008 - 14:18 Der 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.

Nogen eksempler/forslag til en løsning.
Avatar billede hrc Mester
11. februar 2008 - 14:59 #1
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?
Avatar billede hrc Mester
11. februar 2008 - 15:07 #2
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".
Avatar billede hugopedersen Nybegynder
11. februar 2008 - 15:29 #3
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.
Avatar billede hrc Mester
11. februar 2008 - 21:51 #4
Du har nogle datafangst-tabeller du vil have samlet i én tabel, og det i en ordentlig database. Hvilke felter indeholder paradox-tabellerne?
Avatar billede arne_v Ekspert
12. februar 2008 - 03:27 #5
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.
Avatar billede hugopedersen Nybegynder
12. februar 2008 - 07:02 #6
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 :-) )
Avatar billede hugopedersen Nybegynder
13. februar 2008 - 11:45 #7
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.
Avatar billede hrc Mester
13. februar 2008 - 12:24 #8
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;

            Table.Next;
          end;
        finally
          Table.Close;
          Table.EmptyTable;
        end;
      finally
        Table.Free;
      end;
    end;

  finally
    Query.Free;
    List.Free;
  end;
end;

Det hele kan speedes op om man pakker det ind i transaktioner (en pr. paradox-tabel)
Avatar billede hugopedersen Nybegynder
13. februar 2008 - 13:33 #9
Jeg har ikke noget der hedder TSQLQuery i min Delphi.
Avatar billede hrc Mester
13. februar 2008 - 14:45 #10
Det var en komponent der tilfældigt blev valgt, da jeg ikke ved hvad du bruger til at forbinde til MySQL. Hvordan gør du?
Avatar billede hugopedersen Nybegynder
13. februar 2008 - 14:53 #11
Det er det jeg roder med at finde ud af hvad/hvordan man gør. Jeg er som sagt meget grøn i hvordan man gør ting i Delphi
Avatar billede hrc Mester
13. februar 2008 - 22:20 #12
Avatar billede hugopedersen Nybegynder
19. februar 2008 - 13:44 #13
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.

Smid et svar for dine point
Avatar billede hrc Mester
19. februar 2008 - 15:15 #14
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.
Avatar billede hugopedersen Nybegynder
19. februar 2008 - 15:25 #15
OK - det må jeg lige have checket.

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.
Avatar billede hugopedersen Nybegynder
24. februar 2008 - 18:55 #16
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 :-)
Avatar billede hrc Mester
25. februar 2008 - 00:01 #17
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.
Avatar billede hugopedersen Nybegynder
25. februar 2008 - 06:54 #18
en camufleret mail kunne være  oz8hp  snablea  hotmail  punktum  com

Jeg har kun en gammel Delphi 5 her på arbejde, men hvis bare .pas filen er der, så skal jeg nok få det over.
Avatar billede hugopedersen Nybegynder
27. februar 2008 - 13:05 #19
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.
Avatar billede hrc Mester
27. februar 2008 - 13:35 #20
Har den den? Nå ja, bare det virker. Det rigtigste synes jeg dog er at bruge en TDatabase til paradox-siden.
Avatar billede hugopedersen Nybegynder
27. februar 2008 - 13:42 #21
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.
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