[Delphi]SQL Insert query

Pagina: 1
Acties:
  • 272 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Daar ben ik weer :)
Zit nog steeds met die sql queries te worstelen in Delphi 4.
Ik wil in delphi met een insert query een tabel vullen.
Dit is allemaal niet zo heel speciaal, maar ik wil dus de waarden die ingevuld moeten worden uit een combobox halen.
Hoe kan je dat regelen?
Heb het boek Programmeren in Delphi in 21 Dagen(voor school) er op na gelezen en de Delphi 4 helpfile, maar ik kan nix vinden.
Alle hulp is welkom! (zeker omdat het project in een kleine 2 weken af moet zijn :D)
Alvast bedankt.

Acties:
  • 0 Henk 'm!

Anoniem: 22723

je kunt toch gewoon combobox1.text gebruiken ?

Dat is de text die in het vakje staat (de geselecteerd is)

Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Ay, dat de bedoeling ervan, maar hoe geef je dat in je query op?
Dit is tot nu toe (gedeeltelijk) mijn query:
code:
1
SQL.Add('Insert into tafel(tafelnr,tafellocatie) values()')

Nu wil ik dus de waarden voor values (beetje dubbel :D)uit een Tcombobox (of Tedit e.d.) halen.
Hoe ga ik dat in mijn query regelen?

Acties:
  • 0 Henk 'm!

Anoniem: 22723

insert into <table> values ...... (dat stuk had je al)

sql1.add ('values ('' + edit1.text'', ''combobox1.text'')';

Die dubbele ' zijn nodig omdat de sql string ook ' nodig heeft.

Ik weet niet of het +je zo goed is, anders moet de . zijn

(al een tijdje niks in delphi gedaan)

Acties:
  • 0 Henk 'm!

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

Creepy

Tactical Espionage Splatterer

Pak je boek Delphi in 21 dagen er nog eens bij.. en kijk eens of ze daar iets doen met string.


Om maar een voorbeeld te geven:
code:
1
Sql.add('insert into tabelletje values('+edit1.text+')');

En een hint: Kijk eens naar parameters in SQL querys, dan worden je queries niet zo'n zooite van aan elkaar geplakte strings zoals in mijn voorbeeld :) (lang leve de Delphi Help.. de F1 knop is je beste vriend! (tm)

"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


Acties:
  • 0 Henk 'm!

Anoniem: 22723

oja, als je strings gebruikt in een query vond ik het altijd wel handig, om niet zoveel ''''' te hoeven typen (daar ging het vaak op fout), om
code:
1
QuotedStr()

te gebruiker

dus al voorbeeld
code:
1
sql1.add ('insert into <table> values ('+ QuotedStr(edit1.text) +','+ quotedStr(comboBox1.text) + ');

Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Hij compileert wel zo, maar er wordt niets in m'n database gezet.
De primkey in de tafel tabel is tafelnr en dat is een int waarde. Als ik StrToInt gebruik in combo met bovenstaande compileert hij niet.

Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Zo ziet nu mijn niet werkende code eruit (compileert zo wel, maar er wordt niets aan de DB toegevoegd):
code:
1
2
3
4
5
6
7
8
9
10
11
12
begin
   with Query1.Create(nil) do
   try
    DatabaseName := 'rere';
    SQL.Add('Insert into tafel(tafelnr,tafellocatie)
    values(+StrToInt(CbTafelnr.Text)+,
    '+ quotedStr(CbLocatie.text)+')');
    Open;
   except on EDBEngineError do
   LbMelding.Caption:='Tafelnummer bestaat al!';
   end;
end;

Even die try..except eruit gehaald en kijken of ie met een foutmelding kwam, en jawel:
'General SQL Error
Syntaxisfout(operator ontbreekt) in query expressie
+StrToInt(CbTafelnr.Text)+'
Daar doe ik dus iets fout, maar wat?

Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Dan dit geprobeert, werkt ook al niet :(
code:
1
2
3
4
5
6
7
8
9
10
11
begin
with Query1.Create(nil) do
   begin
   DatabaseName := 'rere';
   SQL.Add('Insert into tafel(tafelnr,tafellocatie) 
   values(:tafelnr,:locatie)');
   ParamByName('tafelnr').AsInteger := StrToInt(CbTafelnr.Text);
   ParamByName('locatie').AsString := CbLocatie.Text;
   Open;
   end;
end;

Acties:
  • 0 Henk 'm!

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

Creepy

Tactical Espionage Splatterer

+inttostr() moet je van TUSSEN de ' halen

sql.add('insert into blaat values ('+inttostr(dingetje)+')';

(zie de extra 's dus.. zoals ook al eerder aangegeven)

NOFI, maar misschien is het eerst handig om wat info te lezen over het gebruik van strings en string bewerkingen in (Object)Pascal/Delphi

Is het een school project??? Zo ja, dan had je dit toch echt al moeten weten....

"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


Acties:
  • 0 Henk 'm!

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

Creepy

Tactical Espionage Splatterer

Op vrijdag 17 mei 2002 21:05 schreef FallenAngel666 het volgende:
Dan dit geprobeert, werkt ook al niet :(
code:
1
2
3
4
5
6
7
8
9
10
11
begin
with Query1.Create(nil) do
   begin
   DatabaseName := 'rere';
   SQL.Add('Insert into tafel(tafelnr,tafellocatie) 
   values(:tafelnr,:locatie)');
   ParamByName('tafelnr').AsInteger := StrToInt(CbTafelnr.Text);
   ParamByName('locatie').AsString := CbLocatie.Text;
   Open;
   end;
end;
Ah.. kijk.. dat ziet er beter uit!!

Een query die geen uitvoer teruggeeft (alles wat geen select is) voer hje uit met ExecSQL; i.p.v. Open;

"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


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
DOH!
Ga het gelijk proberen :)
Thx!

Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Zo werkt ie nog niet :(
.
.
.
.
.

PSYCH!!!!
HIJ DOET UT!
EUREKA!
Bedankt man, kan ik weer verder :)
Iedereen bedankt voor de assistentie trouwens!

Acties:
  • 0 Henk 'm!

  • brid
  • Registratie: Januari 2001
  • Laatst online: 29-07-2024

brid

Onze excuses voor het ongemak

heb je in delphi 4 geen DBlookupbox/DBcombobox of iets in die richting. Anders snel oberstappen op delphi 5.

DIY NAS, Hoofd PC
Unchain your pc/laptop, buy a SSD!!!!!


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
DbCombo's enzo koppel je toch rechtstreeks aan je tabel en een kolom daar in?
De wijziginen die je dan aanbrengt worden gelijk in je DB doorgevoerd (dacht ik) dat kan om bepaalde redenen in deze applicatie (als je het zo wil noemen :)) niet.

(Heb Delphi 6 trouwens ook liggen hier, maar op school werken ze met Delphi 4, vanwege evt. uitwisselbaarheidsproblemen (3x woordwaarde) heb ik maar gekozen om dit in Delphi 4 te doen.

Acties:
  • 0 Henk 'm!

  • brid
  • Registratie: Januari 2001
  • Laatst online: 29-07-2024

brid

Onze excuses voor het ongemak

je kan een apply en cancel knopie maken waarmee je de wijziging ongedaan kan maken.

PS op wat voor klote school zitje? Bij het ROC waar ik zat was het altijd meteen overstappen op de nieuwste versie.

DIY NAS, Hoofd PC
Unchain your pc/laptop, buy a SSD!!!!!


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Op het ROC dus!
*PROEST* :D

ROC Zeeland in Vlissingen

Acties:
  • 0 Henk 'm!

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

Creepy

Tactical Espionage Splatterer

Op vrijdag 17 mei 2002 21:31 schreef FallenAngel666 het volgende:
Op het ROC dus!
*PROEST* :D

ROC Zeeland in Vlissingen
Sterkte daar, doe Merk, Sturm, Urbanus, Wirz, Maas en De Zeeuw de groeten :) (als ze er nog werken tenminste hehe!)

"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


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Die zijn er niet allemaal meer (vooral Merk wordt erg gemist :D).

Maare, nog even het volgende.
Ik roep een query aan, die wordt uitgevoerd, vervolgens roep ik hem nog een keer aan en dan krijg ik een access violation. Ik denk dat de query dan nog loopt of bestaat ofzo, want opnieuwe aanmaken lukt dus niet.
Hier is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
procedure TFormTafel.RgKeuzeClick(Sender: TObject);
begin
if RgKeuze.Items[RgKeuze.ItemIndex] = 'Toevoegen' then
   begin
   CbTafelnr.Enabled:=true;
   CbLocatie.Enabled:=true;
   Voeruit.Enabled:=true;
   CbTafelnr.Items.Clear;
   CbTafelnr.Text:='';
   CbLocatie.Items.Clear;
   CbLocatie.Text:='';
   CbLocatie.Items.Add('Keuken');
   CbLocatie.Items.Add('Openhaard');
   CbLocatie.Items.Add('Raam');
   end;

if RgKeuze.Items[RgKeuze.ItemIndex] = 'Verwijderen' then
   begin
   CbTafelnr.Enabled:=true;
   Voeruit.Enabled:=true;
   CbLocatie.Enabled:=false;
   CbTafelnr.Items.Clear;
   CbTafelnr.Text:='';
   CbLocatie.Items.Clear;
   CbLocatie.Text:='';
   with Query1.Create(nil) do
    try
    DatabaseName := 'rere';
    SQL.Add('SELECT tafelnr from tafel where tafelnr not in(select tafelnr from reservering where reserveringsdatum>=Date()) or tafelnr not in(select tafelnr from reservering)');
    Open;
    while not EOF do
       begin
       CbTafelnr.Items.Add(FieldByName('tafelnr').AsString);
       Next;
       end;
    finally Free;
    end;

   end;
end;

Ik heb dus een keuze lijst, druk ik op verwijderen dan worden bepaalde waardes uit de tabel gehaald en in de combobox gezet. Wil ik dan bijvoordeeld iets Toevoegen en ik ga dan weer terug naar Verwijderen krijg ik die Access Violation melding. Delphi geeft dan aan dat het bij deze regel fout gaat:
code:
1
with Query1.Create(nil) do

De query kan dus niet aangemaakt worden (ik denk omdat ie nog bestaat). Wat heb ik gemist?!

Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Iemand al een ideetje?
Zit nog steeds vast namelijk.

Acties:
  • 0 Henk 'm!

  • VisionMaster
  • Registratie: Juni 2001
  • Laatst online: 15-06 21:31

VisionMaster

Security!

advies ...

gebruik nooit een iets als:

with Query1.create(nil) do

maar gebruik gewoon:

Query1.create(nil);
with Query1 do

(ik gebruik Delphi 5, neem aan zelfde principe)

Want op deze manier kan je niet meer (duidelijk) terug lezen of de Query nu al gecreate was of niet uit je foutmeldingen of dat de with-clause fout is.

Verder zag ik in je Select-query dat je de functie 'date()' gebruikte. Ten eerste zonder quotes. Ten tweede maak je er niet een string van, maar een TDateTime van en das geen string. Adviesje gebruik het via een parameter. Uit ervaring is gebleken dat je dan namelijk de foutmelding van de compiler ook op zulke regels krijgt als er iets mis is met een parameter ;) en niet ergens vaag stukkie verder.

I've visited the Mothership @ Cupertino


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:55
Op vrijdag 17 mei 2002 23:20 schreef FallenAngel666 het volgende:
Iemand al een ideetje?
Zit nog steeds vast namelijk.
Het is een goeie gewoonte om eerst een query te sluiten vooraleer je hem opent.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Bedankt voor de hulp jongens, ik heb in iedergeval de aangegeven wijzigingen aangebracht, maar de fout zat hier:
code:
1
finally Free;

De dataset werd nooit gesloten.
Geef ik daar een Close i.p.v. een free, dan is er geen proleem.

Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 17-06 21:00
Op zaterdag 18 mei 2002 13:05 schreef FallenAngel666 het volgende:
Bedankt voor de hulp jongens, ik heb in iedergeval de aangegeven wijzigingen aangebracht, maar de fout zat hier:
code:
1
finally Free;

De dataset werd nooit gesloten.
Geef ik daar een Close i.p.v. een free, dan is er geen proleem.
Inderdaad. Met Free geef je het geheugen vrij dat je Query1 gebruikte.
Met Close sluit je de dataset, als deze active is.
Aangezien je de Query1 zelf create (waarom met nil? Die aowner is er niet voor niets :) De query hoort bij de Form, dus jemoet daar 'self' invullen. Zo wordt het component geFree'd op het moment dat je from destroyed wordt), moet je hem ook free-en... Dat kan in je onDestroy van het form, of (netter), je maakt Query1 lokaal, waarbij je vlak na de create dus een try..finally zet met in de finally de free, dus:
code:
1
2
3
4
procedure TFormTafel.RgKeuzeClick(Sender: TObject);
var Query1 : TQuery;
begin
if RgKeuze...

al maak ik uit de naam (Query1) op dat je hem in de designer op je form hebt gesleept.
Als je hem in de designer op je form zet, waarom ga je hem dan in 's hemelsnaam zelf nog een een keer createn?

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Die query code heb ik ergens uit een voorbeeldje geript :)
In combinatie met wat ik er mee doe is ie dus niet 100% erm...logisch :)

Acties:
  • 0 Henk 'm!

Anoniem: 11826

Misschien is dit je oplossing. Bij mij werkt het wel op deze manier.
code:
1
2
3
4
5
6
7
8
9
10
11
       quKaarten.SQL.text:= 'insert into kaart' + ' (id,contractid, kaartnummer, status, [geldig tot],' + ' kenteken, reservewiel, geprint)' +
       ' values (''' + edtIDK.Text +  ''',''' +
       MEdtContractK.Text +  ''',''' +
       MedtKaartK.Text +  ''',''' +
       MEdtStatusK.Text + ''',''' +
       MEdtGeldigTotK.Text + ''',''' +
       MEdtKentekenK.Text + ''',' +
       sResWiel + ',' +
       sGeprint +
       ')';
       quKaarten.ExecSQL;

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 18:55
Bah, hoe lelijk.

Doe het eens met parameters, da's veel duidelijker:
code:
1
2
3
4
5
6
7
8
9
qryTest.SQL.Text := 'INSERT INTO tabel ' +
              '(naam, adres, opmerking) ' +
              ' VALUES ' +
              '(:p_naam, :p_adres, :p_opm)';
qryTest.ParamByName('p_naam').AsString  := NaamEdit.Text;
qryTest.ParamByName('p_adres').AsString := AdresEdit.Text;
qryTest.ParamByName('p_opm').AsString   := OpmEdit.Text

qryTest.ExecSQL();

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 18:25
Hij werkt perfect zo hoor!
Er zitten alleen nog wat overbodigheden in, maar dat boeit me nix.
Tis een opdracht voor school en er wordt alleen naar het resultaat (de applicatie) gekeken, ze gaan geen source doorspitten :)

Acties:
  • 0 Henk 'm!

Anoniem: 11826

Op dinsdag 21 mei 2002 22:39 schreef whoami het volgende:
Bah, hoe lelijk.

Doe het eens met parameters, da's veel duidelijker:
code:
1
2
3
4
5
6
7
8
9
qryTest.SQL.Text := 'INSERT INTO tabel ' +
              '(naam, adres, opmerking) ' +
              ' VALUES ' +
              '(:p_naam, :p_adres, :p_opm)';
qryTest.ParamByName('p_naam').AsString  := NaamEdit.Text;
qryTest.ParamByName('p_adres').AsString := AdresEdit.Text;
qryTest.ParamByName('p_opm').AsString   := OpmEdit.Text

qryTest.ExecSQL();
Ik wist dit nog niet dat dat kon. Bedankt. Weer wat geleert :-)
Pagina: 1