Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
1
| 'SELECT * FROM song WHERE artist = ' + inttostr(aid) + ''' AND Title LIKE ''%''' + E2title.Text + '%''' |
Maar een nog betere oplossing is:
1
2
3
| Query.SQL.Text := 'SELECT * FROM song where artist = :aid AND Title like :Title';
Query.Parameters.ParamByName('aid').Value:= aid;
Query.Parameters.ParamByName('Title').Value:= '%' + E2title.Text + '%'; |
[ Voor 190% gewijzigd door jelmervos op 08-06-2003 21:19 ]
"The shell stopped unexpectedly and Explorer.exe was restarted."
1
| 'SELECT * FROM song where artist = ' + inttostr(aid) + ' and Title like ''%' + E2title.Text + '%''' |
edit: En na een integer hoeft ook geen quote afgesloten worden.
[ Voor 25% gewijzigd door Just_a_Gamer op 08-06-2003 21:20 ]
"The shell stopped unexpectedly and Explorer.exe was restarted."
zat dus compleet in de verkeerde hoek te zoeken naar een fout
ga eens even naar parambijname
ziet er toch iets duidelijker uit dan die ''''''''''' zooi
iig compileert dit al. das al een hele vooruitgang
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
"The shell stopped unexpectedly and Explorer.exe was restarted."
ondertussen al uren te turen maar ik zie het niet.......
ik probeer dus de " nette " manier te implementeren
eerst : dit is de "vieze" manier........
1
2
3
4
5
6
7
8
9
10
| title1 := E2title.Text ;
SQLQuery1.Close ;
SQLQuery1.SQL.Clear ;
SQLQuery1.SQL.Add('SELECT * FROM song WHERE Title LIKE ''%' + title1 + '%'' AND artist = '+ inttostr(aid) );
SQLQuery1.open ;
If SQLQuery1.RecordCount > 0 then
begin //soortgelijk nr gevonden
ShowMessage('hoi');
end; |
en die werkt
maar goed we wouden het net maken
1
2
3
4
5
6
7
8
9
| title1 := E2title.Text ;
SQLQuery1.Close ;
SQLQuery1.SQL.Clear ;
sqlQuery1.SQL.Text := 'SELECT * FROM song where artist = :aid AND Title like :Title';
sqlQuery1.ParamByName('aid').Value := inttostr(aid);
sqlQuery1.ParamByName('Title').Value := '''%' + E2title.Text + '%''' ;
SQLQuery1.open ;
end ; (einde van functie, doe dus nog niks met de uitkomst) |
dit lijkt goed te gaan. geen compiler fouten
en ook als ik het execute geen problemen
tot ik dit stukje code er weer achter zet...........
1
2
3
4
| If SQLQuery1.RecordCount > 0 then
begin //soortgelijk nr gevonden
ShowMessage('hoi');
end; |
lijkt me een vrij onschuldig stukje
zelfs als heel de uitkomst fucked op was zou ie nog steeds 0 of groter dan 0 zijn (toch ?)
maar zodra ik het nu run :
DbExpress error : operation not supported
ik kan hem niet volgen. blijkbaar is de querry goed, anders lijkt me dat ie al eerder fouten zou geven
maar waarom kan ik dan geen recordcount opvragen
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
Dus wat je wil doen kan helemaal niet met parametersReading RecordCount will generate an exception if the dataset can’t determine the number of records. Do not read RecordCount if
The dataset represents stored procedure.
The dataset represents a query that contains parameters.
The dataset represents a multi-table join.
Misschien een workarround is om eigen recordcount te maken door zelf ff de records te tellen met een while loop
1
2
3
4
5
6
| SQLQuery1.First while not SQLQuery1.EOF do begin inc( JouwTeller ); end; |
edit: Of gebruik de functie IsEmpty
[ Voor 27% gewijzigd door Just_a_Gamer op 11-06-2003 22:17 ]
UmJust_a_Gamer schreef op 11 June 2003 @ 22:12:
Direct uit delphi help file:
[...]
Dus wat je wil doen kan helemaal niet met parameters
forgive me als ik fout lig te denken
(hoe meer ik lees hoe minder ik van de delphi implementatie van sql snap)
maar
The dataset represents a query that contains parameters.
maar als ik die query geopend heb
dan staan daar toch geen parameters meer in ?
dan staan er alleen de uitkomst lijkt me (array van rows dus oid)
of denk ik nou helemaal verkeerd
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
Als je het zo doet, kan je even goed een SELECT count() doen ook hoor.... Dat zal veel performanter zijn als je het aantal records wilt weten vooraleer je door je recordset wilt loopen.Just_a_Gamer schreef op 11 juni 2003 @ 22:12:
Direct uit delphi help file:
code:
1 2 3 4 5 6 SQLQuery1.First while not SQLQuery1.EOF do begin inc( JouwTeller ); end;
edit: Of gebruik de functie IsEmpty
https://fgheysels.github.io/
Er is niet zoiets als de 'Delphi implementatie van SQL' hoor.heuveltje schreef op 11 June 2003 @ 22:19:
[...]
Um
forgive me als ik fout lig te denken
(hoe meer ik lees hoe minder ik van de delphi implementatie van sql snap)
SQL is een taal, die je kan embedden in een ander programma (bv een Delphi programma).
Je denkt verkeerd.The dataset represents a query that contains parameters.
maar als ik die query geopend heb
dan staan daar toch geen parameters meer in ?
dan staan er alleen de uitkomst lijkt me (array van rows dus oid)
Je opent je query wel met parameters.
https://fgheysels.github.io/
http://groups.google.nl/g...lm=3bd5f4b6%241_2%40dnewsRecordCount should not be used with query components. The property is
inherited from the base TDataset class. In order to get a recordcount
against an sql server, the component either needs to fetch all records and
count them locally, or execute an additional query against the server to ask
it for the count. Both can be detrimental and in the latter case, depending
on your query, it cannot always be done.
hmmm wazigJust_a_Gamer schreef op 11 juni 2003 @ 22:12:
wat je wil doen kan helemaal niet met parameters
Misschien een workarround is om eigen recordcount te maken door zelf ff de records te tellen met een while loop
code:
1 2 3 4 5 6 SQLQuery1.First while not SQLQuery1.EOF do begin inc( JouwTeller ); end;
edit: Of gebruik de functie IsEmpty
nou ja isEmpty lijkt te werken
al snap ik absoluut niet waarom recordcount niet meer werkt
lijkt me eerder een bug dan iets logisch.
weet jij zo of er nog meer beperkingen gelden zodra ik params ga gebruiken.
andersom zoeken in de help schiet niet op
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
Daarom gebruik functie IsEmptywhoami schreef op 11 June 2003 @ 22:29:
[...]
Als je het zo doet, kan je even goed een SELECT count() doen ook hoor.... Dat zal veel performanter zijn als je het aantal records wilt weten vooraleer je door je recordset wilt loopen.
De meeste dingen staan in Delphi Help. Beetje zoeken kan geen kwaad.heuveltje schreef op 11 juni 2003 @ 22:32:
[...]
hmmm wazig
nou ja isEmpty lijkt te werken
al snap ik absoluut niet waarom recordcount niet meer werkt
lijkt me eerder een bug dan iets logisch.
weet jij zo of er nog meer beperkingen gelden zodra ik params ga gebruiken.
andersom zoeken in de help schiet niet op
[ Voor 55% gewijzigd door Just_a_Gamer op 11-06-2003 22:37 ]
't Is geen bug, 't is zelfs logisch.heuveltje schreef op 11 juni 2003 @ 22:32:
[...]
al snap ik absoluut niet waarom recordcount niet meer werkt
lijkt me eerder een bug dan iets logisch.
De query component kan in bepaalde gevallen niet weten hoeveel rijen hij returned. Vandaar....
https://fgheysels.github.io/
op zich truewhoami schreef op 11 juni 2003 @ 22:29:
[...]
Als je het zo doet, kan je even goed een SELECT count() doen ook hoor.... Dat zal veel performanter zijn als je het aantal records wilt weten vooraleer je door je recordset wilt loopen.
maar ik ga toch door al die records heenlopen dus om ze dan weer op te vragen leek me wat omslachtig.........
maar goed. ik had gewoon niet verwacht dat recordcount zon rare excepties had, leek me een standaard opdracht.
ehm jawel. das de manier waarop delphi sql implementeerd (dmv oa sqlquery)whoami schreef op 11 juni 2003 @ 22:30:
[...]
Er is niet zoiets als de 'Delphi implementatie van SQL' hoor.
SQL is een taal, die je kan embedden in een ander programma (bv een Delphi programma).
en de stortvloed aan extra methods en variable die eraan hangen.
ik bedoel dit is de php implementatie
[code]
$result = mysql_query("SELECT * FROM todo WHERE td_int = '$up'", $db);
$myrow = mysql_fetch_row($result) ;
[code]
die vink persoonlijk nou een heel stuk helderder...........
ja maar als ik die query open dan houd ie daarna toch alleen results over ?[...]
Je denkt verkeerd.
Je opent je query wel met parameters.
mag toch niet uitmaken hoe ie daar aan kwam , of probeert ie uit de query het aantal velden te lezen zonder deze uit te voeren
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
Als je er 2x door looped, dan moet je je pointer terug naar het eerste record brengen.heuveltje schreef op 11 juni 2003 @ 22:42:
[...]
op zich true
maar ik ga toch door al die records heenlopen dus om ze dan weer op te vragen leek me wat omslachtig.........
Het is het loopen door een recordset dat het langst duurt, niet het ophalen van de records.
Test het maar eens uit bij een query die veel records teruggeeft.
Doe eens een select count() en kijk eens hoe lang dat duurt, en doe eens een select * en loop eens door de recordset om te tellen hoeveel records je krijgt.
Delphi implementeert SQL niet. PHP ook niet.heuveltje schreef op 11 juni 2003 @ 22:42:
[...]
ehm jawel. das de manier waarop delphi sql implementeerd (dmv oa sqlquery)
en de stortvloed aan extra methods en variable die eraan hangen.
ik bedoel dit is de php implementatie
[code]
$result = mysql_query("SELECT * FROM todo WHERE td_int = '$up'", $db);
$myrow = mysql_fetch_row($result) ;
[code]
die vink persoonlijk nou een heel stuk helderder...........
Ze bieden gewoon een manier aan om met databases te communiceren dmv SQL. ZE veranderen niets aan de SQL syntax / dialect van de databank waar ze mee praten.
[ Voor 36% gewijzigd door whoami op 11-06-2003 22:47 ]
https://fgheysels.github.io/
wat is daar zo logisch aan ?whoami schreef op 11 June 2003 @ 22:37:
[...]
't Is geen bug, 't is zelfs logisch.
De query component kan in bepaalde gevallen niet weten hoeveel rijen hij returned. Vandaar....
* heuveltje probeert het echt te snappen
waarom kan hij het wel als
sql.add ('SELECT * FROM song where artist = ' + inttostr(aid))
maar niet als
.SQL.Text := 'SELECT * FROM song where artist = :aid';
sqlQuery1.Params[0].Asinteger := aid
dat is uiteindelijk toch dezelfde querry
en dat het niet al te efficient is is me duidelijk, maar waarom zou ie niet gewoon alle velden kunnen tellen en tot 0 komen.
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
ja maar zoeken op iets wat je in de toekomst tegen kan komen is lastigJust_a_Gamer schreef op 11 juni 2003 @ 22:33:
[...]
Daarom gebruik functie IsEmpty
[...]
De meeste dingen staan in Delphi Help. Beetje zoeken kan geen kwaad.Ik heb weleens met Dbexpress componenten gewerkt. Maar ik heb de hele tijd zonder parameters gewerkt. ( Was namelijk niet nodig ). Wat je rekening moet houden met dbExpress is dat je niet terug kan gaan naar vorige record. Je kan alleen vooruit. Het ligt niet aan de implementatie van dbExpress.
ik deed het in 1e instantie ook zonder. zie topic start maar
maar dit leek me een veel nettere manier.
ondertussen ben ik echt baffeld is de manier waarop delphi/dbExpress omgaat met results
ik verwachte gewoon simpel een arraytje velden over houden, maar ip daarvan krijg ik results die ik maar 1 keer mag lezen
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
Deze rare exceptions treedt niet op als je "oude" bde componenten gebruikt. Overigens vind ik geen rare exceptieheuveltje schreef op 11 June 2003 @ 22:42:
[...]
op zich true
maar ik ga toch door al die records heenlopen dus om ze dan weer op te vragen leek me wat omslachtig.........
maar goed. ik had gewoon niet verwacht dat recordcount zon rare excepties had, leek me een standaard opdracht.
Tis overigens niet hetzelfde als je met parameters gebruikt. Als je parameters gebruikt dan zal DBexpress de sql voor proberen op te bouwen. Dus als de datatype integer is dan zet ie geen quotes omheen etc. Dbexpress bepaalt dan hoe de query voor jou uitziet.heuveltje schreef op 11 juni 2003 @ 22:49:
[...]
wat is daar zo logisch aan ?
* heuveltje probeert het echt te snappen
waarom kan hij het wel als
sql.add ('SELECT * FROM song where artist = ' + inttostr(aid))
maar niet als
.SQL.Text := 'SELECT * FROM song where artist = :aid';
sqlQuery1.Params[0].Asinteger := aid
dat is uiteindelijk toch dezelfde querry
en dat het niet al te efficient is is me duidelijk, maar waarom zou ie niet gewoon alle velden kunnen tellen en tot 0 komen.
Je moet gewoon accepteren dat dbExpress aantal dingen niet kunnen want met gewone TQuery wel kan. Borland heeft getracht al die dingen die missen iets anders op te lossen.
Dan heb je de dbExpress niet goed begrepen. Het idee achter dbExpress is dat het alleen vooruit kan gaan in die resultset. Als je aan het einde van de resultset bent en je wilt ergens in het midden van de resultset een record ophalen dan moet je eerst de procedure First aanroepen en van vooraf aan de resultset aflopen.heuveltje schreef op 11 juni 2003 @ 22:57:
[...]
ja maar zoeken op iets wat je in de toekomst tegen kan komen is lastig
ik deed het in 1e instantie ook zonder. zie topic start maar
maar dit leek me een veel nettere manier.
ondertussen ben ik echt baffeld is de manier waarop delphi/dbExpress omgaat met results
ik verwachte gewoon simpel een arraytje velden over houden, maar ip daarvan krijg ik results die ik maar 1 keer mag lezen
Het is dus niet zo dat je maar 1 keer mag lezen.
Nu ik er over denk over dat select query met count. Stel dat gebruiker 1 haalt voert die query uit maar gebruiker 2 verwijderd een record uit de desbetreffende tabel. Dan heb je toch probleem
ik zit/zat gewoon met de php "implementatie" in me hoofdwhoami schreef op 11 June 2003 @ 22:46:
[...]
Als je er 2x door looped, dan moet je je pointer terug naar het eerste record brengen.
Het is het loopen door een recordset dat het langst duurt, niet het ophalen van de records.
Test het maar eens uit bij een query die veel records teruggeeft.
Doe eens een select count() en kijk eens hoe lang dat duurt, en doe eens een select * en loop eens door de recordset om te tellen hoeveel records je krijgt.
daar stel je 1 keer die query. daar komt een array van records uit.
en dan is de sql server klaar
en dan kun je eindeloos gaan muggeziften met de resultaten en rechtstreeks naar
records gaan en weet ik wat nog meer
in db express werkt dat allemaal blijkbaar compleet anders
[...]
[qoute]
Delphi implementeert SQL niet. PHP ook niet.
Ze bieden gewoon een manier aan om met databases te communiceren dmv SQL. ZE veranderen niets aan de SQL syntax / dialect van de databank waar ze mee praten.[/quote]
dit word woordkloverij.................
delphi bouwt een hele santekraam aan componenten en methodes aan om iets uit die Mysql db gerammeld te krijgen. in php doe ik dat met 4 regels code
en dat wat er uiteindelijk richting server gaat in allebei de gevallen gelijk is snap ik ook nog wel.
voor mij is de implementatie wat ik moet doen om die query richting Mysql te sturen. en de results uit te lezen.......................
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
laat dat duidelijk zijn
hmmm das lekker nuttigHet idee achter dbExpress is dat het alleen vooruit kan gaan in die resultset. Als je aan het einde van de resultset bent en je wilt ergens in het midden van de resultset een record ophalen dan moet je eerst de procedure First aanroepen en van vooraf aan de resultset aflopen.
Het is dus niet zo dat je maar 1 keer mag lezen.
nou ja,. voor mijn simpel apje moet dat geen probleem zijn........
ik doe het wel gewoon zonder params for the moment........
denk dat ik me maar nog moet gaan verdiepen in delphi en db's
er moet toch wel een simpeler manier zijn om dit te bereiken ...................
* heuveltje begint php steeds liever te vinden............
[qoute]
Nu ik er over denk over dat select query met count. Stel dat gebruiker 1 haalt voert die query uit maar gebruiker 2 verwijderd een record uit de desbetreffende tabel. Dan heb je toch probleem
sja gelukkig ben ik de enige user
maar is idd maar een link puntje. je kunt de "index out of bounds" wel aan voelen komen. al zou het wel heel toevallig zijn als dat gelijktijdig gebeurt.......
Heuveltjes CPU geschiedenis door de jaren heen : AMD 486dx4 100, Cyrix PR166+, Intel P233MMX, Intel Celeron 366Mhz, AMD K6-450, AMD duron 600, AMD Thunderbird 1200mhz, AMD Athlon 64 x2 5600, AMD Phenom X3 720, Intel i5 4460, AMD Ryzen 5 3600 5800x3d
Deze bugje heb ik opgemerkt in Delphi 6.
[ Voor 14% gewijzigd door Just_a_Gamer op 12-06-2003 01:07 ]
Tja, dan kan je wel altijd een probleem hebben. Door de recordset loopen om te tellen lost dat probleem echter niet op.Just_a_Gamer schreef op 11 juni 2003 @ 23:01:
[...]
Nu ik er over denk over dat select query met count. Stel dat gebruiker 1 haalt voert die query uit maar gebruiker 2 verwijderd een record uit de desbetreffende tabel. Dan heb je toch probleem( misschien begrijpbaar
)
Ook de RecordCount method zou dat probleem niet oplossen.
Het gaat erom dat de view die user A op de data heeft, zoveel records telt.
https://fgheysels.github.io/
dbExpress en ADO.Net zijn tot het inzicht gekomen dat het cachen van het resultaat van een query niet altijd gewenst is en dat je in veel gevallen alleen vooruit door een recordset heengaat. Het is in webapplicaties vaak zeer overbodig en je hebt op de client geheugen nodig om het resultaat te bewaren en de cursor bij te houden. Als de client wel de gemakken wil van een cached dataset kan dat ook. Dan zijn alle mogelijkheden wel weer beschikbaar, behalve een recordcount dat gewoonweg niet de manier is van RDBMSsen die gebaseerd zijn op SQL. In Delphi heb je daar de TClientDataSet icm een provider voor, maar dbExpress heeft ook een all-in-one component genaamd TSimpleDataset.heuveltje schreef op 11 June 2003 @ 23:13:
[...]
ik zit/zat gewoon met de php "implementatie" in me hoofd
daar stel je 1 keer die query. daar komt een array van records uit.
en dan is de sql server klaar
en dan kun je eindeloos gaan muggeziften met de resultaten en rechtstreeks naar
records gaan en weet ik wat nog meer
in db express werkt dat allemaal blijkbaar compleet anders
We adore chaos because we like to restore order - M.C. Escher
Verwijderd
Dat ligt aan het type cursor dat je gebruikt. (En dus de manier van openen van je database/recordset)Just_a_Gamer schreef op 11 June 2003 @ 22:33:
[...]
Wat je rekening moet houden met dbExpress is dat je niet terug kan gaan naar vorige record. Je kan alleen vooruit. Het ligt niet aan de implementatie van dbExpress.