[delphi]via een adocomponent gegevens inserten in access DB

Pagina: 1
Acties:

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
hoi,

ik zit hier op school met een klein probleempje.
ik moet (helaas) access gebruiken als database, en moet hiervoor in delphi een programma schrijven

nu heb ik het al voor elkaar om gegevens uit de database te halen, maar ik wil nu gegevens IN de database stoppen (update of insert)

nu weet ik SQL commando's en heb al parameters aangemaakt met daarin de waardes die ik in de database wil hebben

hier het stukje code:
code:
1
2
3
4
5
6
7
8
form1.ADOQuery1.Active:=false;
form1.ADOQuery1.SQL.clear;
form1.ADOQuery1.maxrecords:=0;
form1.ADOquery1.SQL.add('INSERT INTO verenigingen
    (naam,nummer,adres_straat,adres_postcode,adres_plaats,telefoonnummer) 
    VALUES(:naam,:nummer,:adres,:postcode,:plaats,:telefoon)
');
form1.ADOQuery1.Active:=true;


nu krijg ik bij de laatste regel deze foutmelding:
'ADOQuery1: CommandText does not return a result set'

mijn leraar denkt dat het component ADOQuery geen inserts kan doen, en ik vroeg me af of er niet een component is wat ongeveer hetzelfde werkt (iig via ADO (dat is verplicht)), maar waarbij ik, net als met php, gewoon alleSQL kan uitvoeren.

edit: ik kom er nu achter dat er wel een leeg record is aangemaakt in de database

[ Voor 9% gewijzigd door BasieP op 10-04-2003 15:34 ]

This message was sent on 100% recyclable electrons.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Als je een INSERT, UPDATE of DELETE statement wilt uitvoeren, dan kan je dat niet zomaar doen door de query op active te zetten of door de query te openen.
De Open() method of de Active property op true zetten, wordt enkel gebruikt bij Select queries, omdat die dan een resultset teruggeven.
Wil je een query uitvoeren die geen resultset teruggeeft (insert, update, delete), dan moet je een andere method aanroepen. Ik vermoed dat dat ExecSQL oid zal zijn. (Als je gebruik maakt van de TQuery component in Delphi is het toch die method, ik weet niet of ze dezelfde naam heeft bij AdoQueries)

[ Voor 36% gewijzigd door whoami op 11-04-2003 10:40 ]

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Bovendien hoef je niet eens SQL te kennen om de query/table te benaderen, te lezen, schrijven, toevoegen en verwijderen.

We adore chaos because we like to restore order - M.C. Escher


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

En als je dat allemaal te moeilijk vindt of je komt er niet uit: Delphi heeft ook nog een fijne component genaamd ADOCommand. Hiermee kun je alle soorten doe-queries uitvoeren. Update, insert, delete.... etc.

My personal website


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 22-08 10:56

Delphi32

Heading for the gates of Eden

Je lege record in de database komt natuurlijk omdat je de parameters wel declareert maar geen waarde geeft.
Dat er een leeg record in de db komt, geeft ook aan dat de tabel geen PK heeft, bij de weg.

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 26-06 10:37

OZ-Gump

terug van weggeweest

@ Delphi32: misschien bedoelt hij met een leeg record een record waar wel (via autonummering) een ID in staat, maar verder niks? Dan spreek ik ook van een lege regel, maar heeft de tabel wel een PK... Toch?

My personal website


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 22-08 10:56

Delphi32

Heading for the gates of Eden

oh ja... sorry, daar heb je natuurlijk helemaal gelijk in :) Je HEBT een Id dan, dus een PK... maar of dat logisch is? Ik doelde meer op de PK op logisch niveau (hij heeft nu een vereniging zonder naam in de db, lijkt me zeer onwaarschijnlijk), niet op fysiek niveau.

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
ik geef de parameters wel waardes, maar heb ik hierboven weggelaten.
En idd, ik heb een auto increment veld, en die krijgt wel een waarde

ik denk dat dat er wel een een nieuwe record bij komt, omdat de code wel uitgevoert word, maar dat dit halverwege stopt, omdat er geen result van af komt (dus de gegevens worden niet ingevoert)

offtopic: weet iemand trouwesn een manier om die parameters te checken?
ik bedoel, je kan ze niet even in een editboxje of showmessage laten zien.
is daar een truckje voor?

This message was sent on 100% recyclable electrons.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Heb je het nu al eens geprobeerd (of gekeken) of zo'n AdoQuery object een method heeft ExecSQL of iets dergelijks?

https://fgheysels.github.io/


  • Rum
  • Registratie: Augustus 2002
  • Laatst online: 07-03 13:06

Rum

Heb je in je SQL-string bewust al die dubbele punten in je value-reeks staan?
wat vul je daar precies in? Daar kan namelijk het probleem ook in zitten!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:27

Creepy

Tactical Espionage Splatterer

Rum schreef op 11 april 2003 @ 14:18:
Heb je in je SQL-string bewust al die dubbele punten in je value-reeks staan?
wat vul je daar precies in? Daar kan namelijk het probleem ook in zitten!
Dat zijn parameters. Die vul je m.b.v. parambyname o.i.d. En BasieP vult ze ook zoals je had kunnen lezen. Delphi houdt dan zelf rekening met het gebruik van 's voor strings e.d., dus daar hoef je zelf helemaal niks voor te doen.

En zoals whoami al zegt: ExecSQL gebruiken als een query geen informatie teruggeeft (= elke soort query behalve een select) zal het probleem oplossen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • ProgrammerX
  • Registratie: Juli 2002
  • Laatst online: 26-02-2021
offtopic: weet iemand trouwesn een manier om die parameters te checken?
ik bedoel, je kan ze niet even in een editboxje of showmessage laten zien.
is daar een truckje voor?
Jammer dat je weglaat op welke manier je de parameters vult. Als je ze op de volgende manier vult:

code:
1
ADOQuery1.Parameters[0].AsString := 'Hallo';


Dan kan je natuurlijk later ook de waarde opvragen (of bekijken als je stept over je code).

De werkwijze die ik normaal hanteer is, dat ik mijn query invul in de query. Ik controleer de parameters en geef ook het type aan en of het input is of niet. Geef de connectie aan die hij moet gebruiken. Dan zet ik mijn query op active en dubbelklik op de query. Dan voeg ik de velden allemaal toe die ik heb geselecteerd (in dit geval is deze stap dus niet nodig). Dan zeg ik na het vullen van de parameters Open. Heb je nu geen resulttype, dan moet je inderdaad ExecSQL gebruiken wat al een paar keer gezegd is.

P.S. Gebruik liever een query voor veel gebruikte commando's, want dan hoef je alleen de parameters te vullen en execsql aan te roepen. Weet namelijk niet of je op deze manier ook het ADOCommand kan gebruiken of dat je bij dit component elke keer de parameters zelf moet aanmaken.

[ Voor 2% gewijzigd door ProgrammerX op 11-04-2003 16:10 . Reden: Typo's ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
code:
1
2
3
4
  form1.ADOQuery1.Parameters[0].value:=combobox1.Text;
  form1.adoquery1.parameters[0].Name:='naam';
  form1.ADOQuery1.Parameters[1].value:=combobox2.Text;
  form1.adoquery1.parameters[1].Name:='adres';


zo voer ik dus de parameters in.
er komt ook een record in de database, maar die is leeg :(

This message was sent on 100% recyclable electrons.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
BasieP schreef op 14 April 2003 @ 10:55:
code:
1
2
3
4
  form1.ADOQuery1.Parameters[0].value:=combobox1.Text;
  form1.adoquery1.parameters[0].Name:='naam';
  form1.ADOQuery1.Parameters[1].value:=combobox2.Text;
  form1.adoquery1.parameters[1].Name:='adres';


zo voer ik dus de parameters in.
er komt ook een record in de database, maar die is leeg :(
Waarom zet je iedere keer nog de naam van die parameters?

Hoe voer je nu de query uit?

https://fgheysels.github.io/


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
code:
1
2
3
4
5
6
7
8
9
10
  form1.ADOQuery1.Parameters[4].value:=combobox5.Text;
  form1.adoquery1.parameters[4].Name:='postcode';
  form1.ADOQuery1.Parameters[5].value:=combobox6.Text;
  form1.adoquery1.parameters[5].Name:='telefoon';

  form1.ADOQuery1.Active:=false;
  form1.ADOQuery1.SQL.clear;
  form1.ADOQuery1.maxrecords:=0;
  form1.ADOquery1.SQL.add('INSERT INTO verenigingen(naam,nummer,adres_straat,adres_postcode,adres_plaats,telefoonnummer) VALUES(:naam,:nummer,:adres,:postcode,:plaats,:telefoon)');
  form1.adoquery1.ExecSQL;


dit is het hele verhaal, ik stel de naam in zodat ik wat makkelijker in de sql code kan onthouden wat wat is..

ik vind par1, par2, par3 etc. een beetje verrot

This message was sent on 100% recyclable electrons.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:02
Normaal gezien ga je eerst je SQL statement aan je query component gaan doorgeven, en dan pas je parameters setten.

Zo dus:
code:
1
2
AdoQuery1.SQL.Add ('INSERT INTO blaat (......');
AdoQuery1.Parameters[0].Value = ...

https://fgheysels.github.io/


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 01:25

Tomatoman

Fulltime prutser

Heb je in de velddefinities (TField of TFieldDef) wel aangegeven wat voor soort parameter wordt doorgegeven? Als het veldtype op undefined staat ingesteld, bestaat de kans dat je query niet lekker werkt. Verander voor iedere parameter het veldtype naar het type dat je verwacht (in jou geval integer of string).

Een goede grap mag vrienden kosten.


Verwijderd

Delphi:
1
2
3
4
5
6
7
8
9
10
With form1.ADOQuery1 do
  begin
    If active then close;
    SQL.clear;
    SQL.add('INSERT INTO verenigingen(naam,nummer,adres_straat,adres_postcode,adres_plaats,telefoonnummer) VALUES(:naam,:nummer,:adres,:postcode,:plaats,:telefoon)');
    ParamByName('postcode').AsString:=Combobox5.Text;
    ParamByName('telefoon').AsString:=Combobox6.Text;
    [.. andere velden ..]
    ExecSQL;
  end 


Dat lijkt er meer op.. en geef aub je componenten etc wat betere namen, zoals 'cmbxPostcode' oid..

[ Voor 14% gewijzigd door Verwijderd op 14-04-2003 13:12 ]


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
bedankt whoami, dat was het idd, het werkt nu

en hezik, die comboboxen zijn niet altijd voor de postcode ofzo, maar wisselen van functie.. (moeilijk uit te leggen)
en de AsString werkt niet.. bestaat niet in de adoquery (misschien wel in een gewone query)
de .value is dynamic type (dus string en int en longint enz.)

[ Voor 32% gewijzigd door BasieP op 14-04-2003 17:37 ]

This message was sent on 100% recyclable electrons.


Verwijderd

en hezik, die comboboxen zijn niet altijd voor de postcode ofzo, maar wisselen van functie.. (moeilijk uit te leggen)
In principe is dat irrelevant. Namen als 'combobox1' zijn altijd fout. Zeker naarmate je meer controls op je formulier oid gaat krijgen wordt dit steeds moeilijker te beheren.
en de AsString werkt niet.. bestaat niet in de adoquery (misschien wel in een gewone query)
de .value is dynamic type (dus string en int en longint enz.)
Klopt, heb het net even nagekeken. In dat geval moeten de parambyname statements aangepast worden naar parameters[x].name en parameters[x].value, maar de rest vd. code klopt wel. Idd doordat je eerst de query zet en dan de parameters.
Pagina: 1