Toon posts:

[C++/Win32/MySql] Updaten doet het niet

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een C++/Win32 applicatie die een connectie heeft met een MySql
database. De connectie gaat goed en het inlezen van alle tabellen + wegschrijven
naar vectoren + uitlezen van vectoren gaat goed.
Maar nu komt het probleem wanneer ik bijvoorbeeld een 'docent' wil toevoegen
vul ik eerst het formulier in, gegevens worden opgeslagen in een structure,
vervolgens wil ik het uitlezen bij een 'update' of 'insert into' query maar dat werkt
niet.

Dit is een voorbeeld naar aanleiding van 'insert into': (deze regels heb ik aan mekaar)
code:
1
2
3
4
5
6
7
8
9
UCHAR  szToevoegenDocent[10000] = "Insert INTO docent (DocentNummer,
  DocentCode, DocentAchternaam, DocentVoorvoegsel, DocentVoornaam,
  DocentStraat, DocentHuisnummer, DocentPostcode, DocentWoonplaats,
  DocentKamernummer) VALUES (m_aDocent.DocentNummer,
  m_aDocent.DocentCode, m_aDocent.DocentAchternaam,
  m_aDocent.DocentVoorvoegsel, m_aDocent.DocentVoornaam,
  m_aDocent.DocentStraat, m_aDocent.DocentHuisnummer,
  m_aDocent.DocentPostcode, m_aDocent.DocentWoonplaats,
  m_aDocent.DocentKamerNr)";
Deze code geeft geen foutmeldingen en hij draait het programma gewoon
maar hij voegt gewoon niets toe in de database.

Het toevoegen van een rij in de database werkt wel op deze manier:
code:
1
2
3
4
5
6
UCHAR  szToevoegenDocent[10000] = "Insert INTO docent (DocentNummer,
  DocentCode, DocentAchternaam, DocentVoorvoegsel, DocentVoornaam,
  DocentStraat, DocentHuisnummer, DocentPostcode, DocentWoonplaats,
  DocentKamernummer) VALUES
  ('104', 'WTE15', 'Wilholt', '', 'Emma', 'Stationsweg', '85',
  '8091AC', 'Wezep', 'T999')";
Maar zoals je begrijpt is dit niet helemaal de bedoeling.

Ik heb al van allerlei typecastingen gnedaa maar zonder succes.

m_aDocent.DocentWoonplaats e.d. zijn allemaal char arrays
m_aDocent.DocentHuisnummer e.d. zijn gewone integers

Ik werk trouwens met Microsoft Visual C++.

Zou iemand weten hoe ik dit kan oplossen? Ik heb namelijk geen idee meer :'( ;(

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 18:47

Kees

Serveradmin / BOFH / DoC
Verwijderd schreef op 02 oktober 2004 @ 07:15:
code:
1
2
3
4
5
6
7
8
9
UCHAR  szToevoegenDocent[10000] = "Insert INTO docent (DocentNummer,
  DocentCode, DocentAchternaam, DocentVoorvoegsel, DocentVoornaam,
  DocentStraat, DocentHuisnummer, DocentPostcode, DocentWoonplaats,
  DocentKamernummer) VALUES (m_aDocent.DocentNummer,
  m_aDocent.DocentCode, m_aDocent.DocentAchternaam,
  m_aDocent.DocentVoorvoegsel, m_aDocent.DocentVoornaam,
  m_aDocent.DocentStraat, m_aDocent.DocentHuisnummer,
  m_aDocent.DocentPostcode, m_aDocent.DocentWoonplaats,
  m_aDocent.DocentKamerNr)";


m_aDocent.DocentWoonplaats e.d. zijn allemaal char arrays
m_aDocent.DocentHuisnummer e.d. zijn gewone integers

Zou iemand weten hoe ik dit kan oplossen? Ik heb namelijk geen idee meer :'( ;(
Kijk eens goed naar wat _wel_ werkt, en naar je eigen code, en let dan vooral op '

MySQL houd niet van strings die niet door ' zijn omgeven

[ Voor 4% gewijzigd door Kees op 02-10-2004 07:25 ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


  • Wiggert
  • Registratie: December 2000
  • Laatst online: 17-11-2025
C++ is al een tijd geleden, maar heb je ' ' om je teksten heen?
Wat ik meestal doe is even de string printen en die even met behulp van ODBC runnen.. Zie je vaak direct wat er mis gaat..

Verwijderd

Topicstarter
"MySQL houd niet van strings die niet door ' zijn omgeven" (Kees)

zorry, maar als je bv m_aDocent.DocentAchternaam tussen '' zet krijg je dus in de
tabel als string 'm_aDocent.DocentAchternaam' ipv de tekst die is ingevuld bij het
formulier die in de variabele m_aDocent.DocentAchternaam staat.

-------------------------------------------------------------------------------------

"Wat ik meestal doe is even de string printen en die even met behulp van ODBC
runnen.. Zie je vaak direct wat er mis gaat.." (Wiggert)

Wiggert hoe bedoel je dit precies? Ik snap niet helemaal hoe je dit bedoeld.. Zou je dit voor mij wat verder uit kunnen leggen?

  • Wiggert
  • Registratie: December 2000
  • Laatst online: 17-11-2025
RayBurn,

Als je szToevoegenDocent[10000] even uitvoert naar scherm in plaats van direct uit te voeren op de database krijg je je query te zien.
Kijk of je die query wel kan uitvoeren op de database. Als dat niet kan, vind je vanzelf de oplossing

Als je een log of debug functie hebt kan je die er mooi voor gebruiken.

Als je die code die je in je startpost gebruikt zou ik het eens zo proberen:
(korte versie)
code:
1
2
3
UCHAR  szToevoegenDocent[10000] = "Insert INTO docent (DocentNummer,
  DocentCode,DocentAchternaam <KNIP>) VALUES ("+m_aDocent.DocentNummer+"',
  '" +m_aDocent.DocentCode+"','"+ m_aDocent.DocentAchternaam+"'<knip>)";


Ik ben er evan vanuit gegaan dat je strings aan elkaar kan plakken met een + teken, maar dat weet je zelf waarschijnlijk beter

Succes

[ Voor 7% gewijzigd door Wiggert op 02-10-2004 12:45 ]


Verwijderd

Topicstarter
Whipper,

ik heb gedaan wat je zei, gewoon even via een MessageBox gekeken als hij
uberhaupt goed werd uitgevoerd (dom dat ik daar niet aan had gehad gedacht,
maar zal wel door het harde werken komen 8)7 |:( ). Maar hij werd dus niet goed
uitgevoerd.

Ik dacht eindelijk nu weet ik hoe het moet, maar nu lukt het nog niet :(
Jouw manier lukte niet, omdat het gaat om een UCHAR en dan werkt de + niet..
krijg je een foutmelding 'cannot add two pointers'.

Dus had ik het volgende gedaan
code:
1
2
3
4
5
6
7
8
9
10
strstream huisnr;
huisnr << m_aDocent.DocentHuisnummer << ends;
string buffer;
buffer = string( "Insert INTO docent VALUES (" ) + "'105', '" + (string)
    m_aDocent.DocentCode + "', '" + (string)m_aDocent.DocentAchternaam 
    + "', '" + (string)m_aDocent.DocentVoorvoegsel + "', '" + (string)
    m_aDocent.DocentVoornaam + "', '" + (string)m_aDocent.DocentStraat
    + "', '" + huisnr.str() + "', '" + (string)m_aDocent.DocentPostcode
    + "', '" + (string)m_aDocent.DocentWoonplaats + "', '" + (string)
    m_aDocent.DocentKamerNr + "')";

Ik een MessageBox er neer gegooid en de string is perfect.. nu zul je denken wat
wat is dan het probleem, nou dit is een string en ik heb nodig een unsigned
character array.. ik dus zoeken naar een casting tussen die 2 maar ik kan er niet
uit komen ;( Heeft iemand een id hoe je converteert van een string/strstream
naar een unsigned char array.. of weet iemand een andere oplossing?

Verwijderd

Je kan MySQL++ gebruiken, een leuke oefening in template functies. Of, als het quick-and-dirty moet kan je sprintf gebruiken ;).

Verwijderd

Topicstarter
"Je kan MySQL++ gebruiken, een leuke oefening in template functies. Of, als het
quick-and-dirty moet kan je sprintf gebruiken" (bloog)

Jah hele leuke oefening.. maar ik kan het niet meer vinden, snap er niets meer
van. Jij blijkbaar wel, kun je me niet wat beter helpen als dit? Want ik zit er al
dagen mee vast en wanneer ik dit probleem eindelijk heb opgelost kan ik pas
verder gaan met mijn project. Wanneer dit probleem weg is kan ik bijna alles
afmaken, maar dit is gewoon iets waar ik niet uit kan komen ;(

-------------------------------------------------------------------------------

Kan iemand me a.u.b. goeie tips geven. Geef een sample code, een website waar
het zeker weten opstaat maak niet uit wat. Ik wil er namelijk best van leren, maar
ik word nou zo gek hiervan. Alvast bedankt

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:03

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kunt sowieso beter een ostringstream gebruiken om je string te bouwen. Je kunt dan gewoon elementen toevoegen met de << operator, zoals bij std::cout. Vervolgens kun je met ostringstream::str () de resulterende string opvragen.

C++:
1
2
3
4
5
6
7
8
#include <sstream>

std::string voorbeeld (int bla, const char * woei)
{
    std::ostringstream str;
    str << "Hoi " << bla << ", " << woei;
    return str.str ();
}


you get the idea :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
.oisyn,

ik snap perfect wat je bedoeld :) maar het probleem is dat ik bij SQLPrepare een unsigned char * nodig heb. Ik had al een string waar het instond en die heet 'buffer'. Hier staat de hele query in met alle ingevoerde velden bij het formulier 'Toevoegen Docent' (Insert INTO docent VALUES blabla). Nu heb ik ook dit:
code:
1
2
3
4
5
6
7
8
9
    const char *cp = buffer.c_str();
    UCHAR *szTD = (UCHAR*)cp;
    UCHAR proberen[] = "Insert INTO docent VALUES
         ('105', 'a', 'a', 'a', 'a', 'a', '1', 'a', 'a', 'a')";
    
    MessageBox(NULL, buffer.c_str(), TEXT("Uitvoer"), 0);
    MessageBox(NULL, cp, TEXT("Uitvoer"), 0);
    MessageBox(NULL, (const char*)szTD, TEXT("Uitvoer"), 0);
    MessageBox(NULL, (const char*)proberen, TEXT("Uitvoer"), 0);

De uitvoer van de eerste 3 messageboxjes is:
Insert INTO docent VALUES (<data die is ingevoerd bij het formulier>)

En de uitvoer bij het laatste messageboxje is:
Insert INTO docent VALUES ('105', 'a', 'a', 'a', 'a', 'a', '1', 'a', 'a', 'a')

Wanneer ik vervolgens dit heb staan een stuk verder in de code
code:
1
2
 // Prepare the SQL statement by assigning it to the statement handle
 retcode = SQLPrepare (hStmt, proberen, sizeof (proberen));
Dan wordt de query goed uitgevoerd en wordt er een rij toegevoegd in de tabel docent met de values 105, a, a, a, a, a, 1, a, a, a.

Wanneer ik de code verander in bijvoorbeeld:
code:
1
2
 // Prepare the SQL statement by assigning it to the statement handle
 retcode = SQLPrepare (hStmt, szTD, sizeof (szTD));
Dan krijg ik geen foutmelding bij de applicatie, word gewoon uitgevoerd maar er wordt niets aan de database toegevoegd.

Ik begrijp er echt helemaal niets meer van :'( Ik hoop dat iemand me kan helpen..

Verwijderd

hmmm, wat denk je dat sizeof(szTD) is? Das dus gewoon vier ;)
Ik zou proberen strlen(szTD) (of als je unicode gebruikt wcslen).

Overigens, waarom niet gewoon de output van buffer.c_str() casten naar UCHAR*?
dus
C++:
1
retcode = SQLPrepare ( hStmt , ( UCHAR * ) buffer.c_str ( ) , buffer.length ( ) ) ;


en tenslotte : het resultaat van sizeof ( ) wordt volgens mij compile-time bepaalt!

[ Voor 56% gewijzigd door Verwijderd op 03-10-2004 22:49 ]


Verwijderd

Probeer eens:

retcode = SQLPrepare (hStmt, (UCHAR*)buffer.c_str(), buffer.size());

HTH,
Willem.

Verwijderd

Verwijderd schreef op 03 oktober 2004 @ 23:17:
Probeer eens:

retcode = SQLPrepare (hStmt, (UCHAR*)buffer.c_str(), buffer.size());

HTH,
Willem.
Oeps, Akhorahil was me voor..

Verwijderd

Topicstarter
Akhorahil & TopTools,

superbedankt _/-\o_ I Salute You _/-\o_

ik heb de oplossing van Akhorahil gewoon gebruikt en hij deed het...
en dan als ik het zo lees en zie denk ik jee wat dom van me...
en ik probeer het toch nog maar een keer af te schuiven op het feit dat ik teveel
eraan heb gewerkt en helemaal niet meer logisch nadenk :P

Verwijderd

Als het omzetten naar UCHAR later toch een probleem geeft.
code:
1
2
3
4
5
6
7
8
9
UCHAR* convert2UCHAR( LPCSTR szInput, UCHAR* szOutput )
{
  UINT n = strlen(szInput);
 for( UINT m=0; m<n; m++ )
    {
        szOutput[m]=(UCHAR) szInput[m];
     }
   return szOutput;
}


Nu vraag ik me wel af of die impliciete cast naar (UCHAR) van een CHAR te weten szInput wel goed gaat, omdat ik zelf altijd met TCHAR werk, en daar heb je wel een functie nodig, maar TCHAR is 16 bit, en UCHAR en CHAR zijn allebei 8 bit (bytes) denk ik. Als het niet goed gaat op deze impliciete cast manier moet je bij szInput[m] 127 optellen of anders 128. (immers signed naar unsigned.)

[ Voor 14% gewijzigd door Verwijderd op 04-10-2004 00:02 ]

Pagina: 1