Avatar billede ruma1974 Nybegynder
13. januar 2008 - 11:03 Der er 7 kommentarer og
1 løsning

adoquery problem

Hej,

Jeg har følgende kode der bruger adoquery. Jeg har tested

select count(*) As NumberOfRecords from Results where TargetFile_IdtargetFile=1

Direkte med MySQL og det virker fint. Problemet er at når jeg køre nedenstående kode fra delphi så modtager MySQL serveren ikke ovenstående MySQL kommando men istedet for:

select * from result

Som naturligvis tager lang tid at køre - mystisk?

q1.Close;
q1.SQL.Clear;
q1.SQL.Add('select count(*) As NumberOfRecords from Results where TargetFile_IdtargetFile='+inttostr(spinedit9.value));
q1.Active:=true;
q1.Open;
q1.First;
edit8.Text:=q1.FieldByName('NumberOfRecords').AsString;
q1.Close;

Mvh,

Rune
Avatar billede martinlind Nybegynder
13. januar 2008 - 12:44 #1
prøv evt. select count(<keyfield>) as .....

det er jo ikke nødvendigt at selecte hele din record for at tælle hvor mangge du har :)
Avatar billede ruma1974 Nybegynder
13. januar 2008 - 13:24 #2
select count(<keyfield>) as

Giver samme resultat:

MySQL server modtager:

select * from results;

Min SQL sætning kør fint hvis jeg køre den fra MySQL query browser men når jeg submitter den med en adoquery fra delphi så modtager MySQL serveren:

select * from results;

Det tyder på at adoquery ikke submitter min MySQL sætning korrekt!
Avatar billede hrc Mester
14. januar 2008 - 11:17 #3
Du kan lave din select en hel del pænere ved at skippe direkte formatering af scriptet. Nedenstående virker hos mig.

q1.SQL.Clear;
q1.SQL.Add('select count(*) as TargetFilCount');
q1.SQL.Add('  from results');
q1.SQL.Add('  where (targetfile_idtargetfile = :targetfile_idtargetfile)');

with q1.Parameters.ParamByName('targetfile_idtargetfile') do
begin
  DataType := ftInteger;
  Value := SpinEdit9.Value;
end;

q1.Open
try
  result := q1.FieldByName('TargetFilCount').AsInteger;
finally
  q1.Close;
end;
Avatar billede hrc Mester
14. januar 2008 - 11:24 #4
Nu er ovenstående ikke særlig stringent og pænt, men her bliver det et helt skoleeksempel (:-):

function <Class>.GetTargetFileCount(const aValue: integer): integer;
var
  Query: TADOQuery;
begin
  Query := TADOQuery.Create(nil);
  try
    Query.ConnectionString := '...';

    Query.SQL.Clear;
    Query.SQL.Add('select count(*) as TargetFilCount');
    Query.SQL.Add('  from results');
    Query.SQL.Add('  where (targetfile_idtargetfile = :targetfile_idtargetfile)');

    with Query.Parameters.ParamByName('targetfile_idtargetfile') do
    begin
      DataType := ftInteger;
      Value := aValue;
    end;

    Query.Open
    result := Query.FieldByName('TargetFilCount').AsInteger;
  finally
    Query.Free;
  end;
end;

Plejer i øvrigt ikke at sætte connectionstengen direkte, men har et TDataModule hvori jeg har en CreateQuery funktion som opretter og sætter ConnectionString:

TDM.CreateQuery: TADOQuery;
begin
  result := TADOQuery.Create(nil);
  result.ConnectionString := '...';
end;
Avatar billede ruma1974 Nybegynder
16. januar 2008 - 20:07 #5
Jeg kan ikke få adoquery til at virker. MySQL modtager hele tiden:

Select * from results

også når jeg bruger ovenstående formattering.

Jeg har nu løst problemet rent pratisk med adodataset men det er ikke en særlig handy metode.
Avatar billede martinlind Nybegynder
16. januar 2008 - 20:28 #6
Du kunne prøve at lave en storedproc som gør det rigtigt også bruge den
Avatar billede martinlind Nybegynder
16. januar 2008 - 20:29 #7
eller skift til en ordenlig SQLServer = www.FirebirdSQL.org *S*
Avatar billede ruma1974 Nybegynder
25. januar 2008 - 10:51 #8
Mange tak for komentar fra både hrc og martinlind. FirebirdSQL ser ud til at værre et godt alternative til MySQL.

Er det let at konvertere databaser fra MySQL til Firebird?

Er der nogle gode og frie programmer til database design for Firebird databaser?

Hvordan er hastigheden på data transfer samenlignet med MySQL.
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