24. juni 2013 - 08:39Der er
9 kommentarer og 2 løsninger
Overføre data fra SQL
Hej,
Jeg henter en række data fra en SQL server og skal så have dem ført videre ind i programmet til visualisering, afrapportering mv. Problemet er hvordan jeg får de data ført ind i programmet "bedst"?
1) Skal jeg overføre data via en funktion der returnere en TADOQuery?
2) SKal jeg lave en specielt indrettete Record klasse hvor data fra SQL serveren så sættes ind i denne record klasse?
3) SKal jeg bygge det op via en TStringlist hvor data så på "en eller anden måde" er lagt ind i TStringlist?
Hvis du 'bare' skal vise data er det vel bare at smide et TDBGrid på en form og så opsætte en passende datsource der selecter dine data og så linke dem. Hvis du ikke skal/vil rette i data kan griddet sættes til readonly.
Hvis du vil skrive ud er det straks en anden sag. Jeg har aldrig fundet en 'nem' måde der i standard Delphi så jeg gør det via et grid fra DevExpress og så deres udskriftsystem som virker ret godt. Alternativt er FastReports med i nyere versioner af Delphi - dog i en lidt begrænset version så vidt jeg har kunnet konstatere.
Jeg kalder funktionen A fra en procedure B. Funktionen A laver en SQL forespørgsel for at hente forskellige data.
Hvordan får jeg nu lettest overført data fra Funktionen A til proceduren B? Proceduren B indeholder så forskellige former for behandling af data, visualisering, afrapportering, statistik mv.
1) Skal funktionen A returnere en TADOQuery? 2) Skal funktionen A returnere en Record? 3) Skal funktionen A returnere en TStringList?
Altså, helt generelt - hvordan sender jeg data videre i kildekoden lettest??
Hvordan gør man det smartest??
TDBGrid er ikke en løsning fordi jeg ikke skal have data ud på en form eller lignende - jeg skal bare have dem overført "inde i kildekoden"
Følgende bruger jeg til at læse brugerdata fra en tabel og overføre bruger ID til en combobox Query := frmUniConn.CreateQuery; er et kald der returnerer en Query (i mit tilfælde en TUniQuery da jeg bruger UniDAC) Logfile.Error er min egen rutine til at skrive en fejlmeddelelse i en logfil Det er den metode jeg bruger når jeg tager fat på data der ikke lige skal bruges i en standard datacontrol
procedure TfrmLogon.SetupUser; var Query: TUniQuery; UserID: string; begin cboUserID.Clear; Query := frmUniConn.CreateQuery; try Query.SQL.Clear; Query.SQL.Add('SELECT flduser_id'); Query.SQL.Add(' ,flduser_enabled'); Query.SQL.Add(' FROM ' + TableUsers); Query.SQL.Add(' WHERE flduser_enabled = :flduser_enabled'); Query.ParamByName('flduser_enabled').AsBoolean := True; Query.SQL.Add('ORDER BY flduser_id'); try Query.Execute; while not Query.Eof do begin UserID := Query.FieldByName('flduser_id').AsString; cboUserID.Items.Add(UserID); Query.Next; end; except on E:exception do begin Logfile.Error('F_Logon.SetupUser: ' + E.Message); Query.Next; end; end; cboUserID.ItemIndex := 0; finally Query.Free; Application.ProcessMessages; end; end;
Tja, jeg er jo ikke professionel som jer, så lige nogle uddybende grænsende til pinlige spørgsmål:
1) HugoPedersen: Jeg er med på at du returnere en Query men hvor er din connection? Jeg kan ikke lave en ADOQuery uden ADOConnection? Jeg prøver derefter at "FREE" connection men ikke adoquery i funktionen A og det går ikk' godt... Er det bedre at reurnere et TDatasource?
2) Arne_V: "TList indeholdende instanser af en data klasse" hmmmmm... et simpelt eksempel, tak... ;-)
3) Kroning: Kan jeg retunere et TClientDataSet fra en ADOQuery/ADOConnection hvor jeg så først har Free ADOQuery/ADOConnection?? Har du et simpelt eksempel?
Al styring af min connection og den slags ligger i et datamodul som jeg opretter og releaser i min mainform - så har jeg den altid Hvis jeg skal bruge den på en anden form så user jeg den og sætter connection på komponenterne til frmUniConn.UniServer som er navnet på formen.connectionkomponenten (Uni er igen fordi jeg bruger UniDAC)
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.