19. februar 2005 - 13:16Der er
7 kommentarer og 1 løsning
Problem med dataudtræk fra Access database
Jeg har følgende kode:
ScheduleDataset.Close; ScheduleDataset.CommandText:= 'SELECT * FROM Calendar WHERE Calendar.Dato = #'+DateTimeToStr(CurDate)+'#;'; ScheduleDataset.Open; if not ScheduleDataset['Schedule'] = '' then begin Schedule:= ScheduleDataset['Schedule']; ScheduleDataset.Close; ScheduleDataset.CommandText:= 'SELECT * FROM Schedules WHERE Schedules.Name = #'+Schedule+'#;'; ScheduleDataset.Open; Stringgrid1.Cells[0, 1]:= ScheduleDataset['0x1']; end;
Den første tabel der bliver brugt er en tabel ved navn Calendar og det data der skal bruges findes under feltet Dato. Den næste tabel der skal bruges hedder Schedules og deri findes felterne Name og 0x1.
Jeg tror fejlen ligger i den første del af koden da det slet ikke ser ud til at det i if not løkken ikke udføres.
Jeg håber der er en anden der lige kan finde fejlen da jeg simpelthen ikke selv kan se den.
Nu kan jeg altså slet ikke se nogen løkke, en if-not er i alt fald ikke. Hvorfor joiner du ikke tabellerne?
En TADOQuery burde kunne håndtere nedenstående:
select s.0x1 from Schedules s join Calendar c on (c.Schedule = s.Schedule) where c.Dato = :Dato
- kan ikke huske om der skal paranteser eller firkantklammer om felterne, men i grundtræk bør queryen se sådan ud. I øvrigt er det noget skod, at du søger "selct * ..". Angiv kun de felter som du skal bruge. Noget andet skod er måden du opbygger dine parametre på. Har sagt det før og siger det igen: Brug Queryens Parameters-property til at angive disse værdier.
Query.Parameters.QueryByName('Dato').Value := CurDay; // vistnok sådan i ADO
Nås så det er samlet i ét effektivt script, kan du lave den goe' gamle while-løkke:
Query.Open; try while not Query.Eof do begin Stringgrid.Cells[0,1] := Query.FieldByName('0x1').AsString; // Alternativt vistnok også muligt: Stringgrid[0,1] := Query['0x1']; Query.Next; end; finally Query.Close; end;
Eller hvis du kun skal have en singelton (én record ud):
Query.Open; try if Query.Eof then raise execption.Create('Ingen record fundet'); // Alt: assert(not Query.Eof); Stringgrid.Cells[0,1] := Query.FieldByName('0x1').AsString; finally Query.Close; end;
Det med en æøkke var lige en "skrivefejl" ;) Men kan du se hvad der er galt med min kode? Vil mene jeg joiner den ved ScheduleDataset.Connectionstring := Min tabel
Får en fejl om at parameterobjekltet er forkert defineret eller oplysningerne er mangelfulde ved denne kode:
Query.SQL.Text:='s.0x1 from Schedules s'+ 'join Calendar c on (c.Schedule = s.Schedule)'+ 'where c.Dato = :Dato'; Query.Open; try while not Query.Eof do begin Stringgrid1.Cells[0,1] := Query.FieldByName('0x1').AsString; // Alternativt vistnok også muligt: Stringgrid[0,1] := Query['0x1']; Query.Next; end; finally Query.Close; end;
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.