[c++] builder + access + query,.. text invoeren??

Pagina: 1
Acties:

  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
Ik zit leuk te experimenteren met builder en een database (M$MS access)
Nu kan ik al we een query doen maar ik kan op een een of andere rede geen text invoegen. ik heb in access wel netjes ingevult.
ook heb ik een kolom "datum" in de database staan, maar daar kan ik ook alleen maar integers naartoe schrijven, en die interpeteerd ie natuurlijk ook weer helemaal fout...

dit is wat hij wel doet:
insert into FoutMeldingen (SerieNummer, FoutMelding, Datum) values ( 333333315, 1, 4604);

en dit is wat het hoort te zijn, maar dus niet werkt:
insert into FoutMeldingen (SerieNummer, FoutMelding, Datum) values ( 333333315, motor, 4-6-04);

ik kan hier echt helemaal niks over vinden en ik hoop dat jullie mij een oplossing kunnen geven :/

[ Voor 5% gewijzigd door gorgi_19 op 04-06-2004 08:41 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
Rond motor moet je quotes zetten.

Hoe bouw je je query op? Toon eens een stukje relevante code? Welke componenten gebruik je?

Als je een TQuery gebruikt, kan je dit doen:
code:
1
2
3
4
5
6
MyQuery->Text->SQL = "INSERT INTO Foutmelding ( serienummer, foutmelding, datum) " +
                        "VALUES ( :p_serie, :p_fout, :p_datum)";
MyQuery->ParamByName ("p_serie").AsInteger = 500;
MyQuery->ParamByName ("p_fout").AsString = "motor";
MyQuery->ParamByName ("p_datum").AsDateTime = eendatum;
MyQuery->ExecSQL();

https://fgheysels.github.io/


  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
ok, ik had die hele query eigenlijk opgesteld in een String, maar dan kun je geen " gebruiken...
dit ga ik even proberen, igg bedankt voor de snelle reactie. Ik laat nog wel even weten als het gelukt is.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 10:31

gorgi_19

Kruimeltjes zijn weer op :9

hilbren schreef op 04 juni 2004 @ 08:41:
ok, ik had die hele query eigenlijk opgesteld in een String, maar dan kun je geen " gebruiken...
dit ga ik even proberen, igg bedankt voor de snelle reactie. Ik laat nog wel even weten als het gelukt is.
Normaliter gebruik je in MS Access voor tekst een single quote, geen double quote. Neem anders ook even P&W FAQ - De "quickstart" door, je topic is nogal vaag... :)

Sowieso lijkt de oplossing van whoami, icm parametrized queries, de beste.

[ Voor 21% gewijzigd door gorgi_19 op 04-06-2004 08:47 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
hilbren schreef op 04 juni 2004 @ 08:41:
ok, ik had die hele query eigenlijk opgesteld in een String, maar dan kun je geen " gebruiken...
Als je die " of ' escaped wel, maar het is iig niet de aan te raden manier om een query op te stellen, dit omwelle van SQL injection enzo. (Zie ook de FAQ over het stukje mbt parametrized queries).

Er kunnen natuurlijk wel wat foutjes zitten in m'n voorbeeld; 't is al lang geleden dat ik nog wat met C++ builder gedaan heb

[ Voor 37% gewijzigd door whoami op 04-06-2004 08:48 ]

https://fgheysels.github.io/


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 22-05 12:29
Yep, enkele kleine foutjes: 2 strings kan je zo niet optellen.
gewoon de '+' weglaten is ok

En ParamByName geeft een pointer terug, dus -> ipv .

C++:
1
2
3
4
5
6
MyQuery->Text->SQL = "INSERT INTO Foutmelding ( serienummer, foutmelding, datum) " 
                        "VALUES ( :p_serie, :p_fout, :p_datum)";
MyQuery->ParamByName ("p_serie")->AsInteger = 500;
MyQuery->ParamByName ("p_fout")->AsString = "motor";
MyQuery->ParamByName ("p_datum")->AsDateTime = eendatum;
MyQuery->ExecSQL();

  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
er zaten wel een paar kleine "foutjes" in, builder snapte weer iets niet...

code:
1
2
3
4
5
6
    Form1->Query1->SQL->Text = "blaat";//"INSERT INTO Foutmelding ( serienummer, 
foutmelding, datum) " + "VALUES ( :p_serie, :p_fout, :p_datum))";
    Form1->Query1->ParamByName ("p_serie")->AsString = serienr;
    Form1->Query1->ParamByName ("p_fout")->AsString = Fout;
    Form1->Query1->ParamByName ("p_datum")->AsString = Date();
    Form1->Query1->ExecSQL();


dit is hem tot nu toe, hij kan alleen "p_serie" niet vinden, zegt ie als hij de query uitvoerd. ik weet ook niet precies wat je nu precies doet met :p_serie ? wil je dat misschien wat toelichten?

serie nr kon hij trouwens niet omzetten naar een integer, lekker wazig, wat is daar nu moeilijk aan... :?

ik ben nog niet heel er goed in c++ (minder dan een half jaar (soms) mee bezig)


edit: code was wat aan de lange kant, even op enter gedrukt :P

[ Voor 43% gewijzigd door hilbren op 04-06-2004 09:07 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
die :p_serie, etc... zijn parameters/placeholders waar er later een waarde aan toegekend wordt.

Hij kan die p_serie niet vinden omdat die query niet toegekend wordt aan je TQuery. (Die string staat in commentaar).

https://fgheysels.github.io/


  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
oh, ja ... STOM

ow en er moet ook nog een ";" achter de query :P

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:52
schoene schreef op 04 juni 2004 @ 08:56:
Yep, enkele kleine foutjes: 2 strings kan je zo niet optellen.
In C++ Builder heb je toch een AnsiString waarin die + geoverloaded is? :?

https://fgheysels.github.io/


  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
Echt bedankt, hier was ik echt nooit zelf uitgekomen, t'werkt perfect nu.
code is uiteindelijk:
code:
1
2
3
4
5
6
7
8
void ErrorToDb (String serienr, String Fout)
{
    Form1->Query1->SQL->Text = "INSERT INTO FoutMeldingen ( serienummer, foutmelding, datum) VALUES ( :p_serie, :p_fout, :p_datum);";
    Form1->Query1->ParamByName ("p_serie")->AsString = serienr;
    Form1->Query1->ParamByName ("p_fout")->AsString = Fout;
    Form1->Query1->ParamByName ("p_datum")->AsString = Date();
    Form1->Query1->ExecSQL();
}

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 22-05 12:29
whoami schreef op 04 juni 2004 @ 09:19:
[...]

In C++ Builder heb je toch een AnsiString waarin die + geoverloaded is? :?
Ja, maar die conversie gebeurt maar nadat de 2 strings samengeteld zijn:
(+ heeft voorang op =)

C++:
1
2
3
4
AnsiString str = "jaja" + "neenee"; //fout
AnsiString str = "jaja"  "neenee"; //goed
AnsiString str = AnsiString("jaja") + "neenee"; //goed
AnsiString str = "jaja" + AnsiString("neenee"); //goed

  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
nog even een kleinvraagje op het gebied van queries:
"Select count " werkt
"Select Distinct" werkt ook
maar "select count (distinct .....) " werkt niet
ik heb al vanalles geprobeert met haakjes ed, maar niks is werkend te krijgen

op internet heb ik meerdere tuts gevonden waarin staat dathet zou moeten werken :?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 10:31

gorgi_19

Kruimeltjes zijn weer op :9

werkt niet
Definieer werkt niet. Foutmeldingen? verschijnselen?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
General SQL error.
[Microsoft][ODBC Microsoft Acces Driver] Undifined function 'distinct' in expresion.

Form1->Query1->SQL->Text = "Select Count (Distinct (Foutmeldingen.SerieNummer)) From WasMachine, Foutmeldingen where WasMachine.DistrNummer=:p_blaat and WasMachine.SerieNummer=Foutmeldingen.SerieNummer;";

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
DISTINCT gaat over alle rijen die terug komen en niet over een aparte kolom.

Select Count(Foutmeldingen.SerieNummer) From Foutmeldingen LEFT JOIN Wasmachine ON WasMachine.SerieNummer=Foutmeldingen.SerieNummer where WasMachine.DistrNummer=:p_blaat

^ maybe werkt dat wel? ^ (Misbruik maken van een JOIN O-) )

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

schoene schreef op 04 juni 2004 @ 10:15:
[...]


Ja, maar die conversie gebeurt maar nadat de 2 strings samengeteld zijn:
(+ heeft voorang op =)

C++:
1
2
3
4
AnsiString str = "jaja" + "neenee"; //fout
AnsiString str = "jaja"  "neenee"; //goed
AnsiString str = AnsiString("jaja") + "neenee"; //goed
AnsiString str = "jaja" + AnsiString("neenee"); //goed
Leg het dan ook even goed uit.... een string constante is van het type const char *, en als je die 2 bij mekaar optelt is dat zogenaamde Suspicious Pointer Arithmetic, oftewel je probeert iets met een pointer te doen wat voor 99.9999% zeker niet de bedoeling is :)

Het volgende werk overigens wel, als we dan even geinig bezig zijn:
C++:
1
2
AnsiString str("Pietje");
AnsiString str2 = Pietje + " is " + "een" + " aardige" + " jongen";

De operator + wordt left-to-right geevalueerd, en dus is dit een opeenstapeling van 4 keer AnsiString AnsiString::operator+(const char*) :)

Professionele website nodig?


  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
Shadowman schreef op 13 juni 2004 @ 19:52:
DISTINCT gaat over alle rijen die terug komen en niet over een aparte kolom.

Select Count(Foutmeldingen.SerieNummer) From Foutmeldingen LEFT JOIN Wasmachine ON WasMachine.SerieNummer=Foutmeldingen.SerieNummer where WasMachine.DistrNummer=:p_blaat

^ maybe werkt dat wel? ^ (Misbruik maken van een JOIN O-) )
Jammer mar helaas, ik wil graag een query maken die dus het aantal wasmachines telt van 1 bepaald distriebutienummer en die voorkomt in de lijst van foutmeldingen (maar er kunnen meerdere fouten van diezelfde wasmachine in die tabel staan, vandaar dat ik distinct wilde gebruiken)


@curry684:

bedankt voor de uitleg, het is nu helemaal duidelijk
Pagina: 1