[C++/SQLite3] String terugsturen in variabele?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ETzPliskin
  • Registratie: Januari 2003
  • Laatst online: 18:07

ETzPliskin

PS3 ID: Kretus

Topicstarter
Ik ben bezig een c++ programma te schrijven dat een soort 'webwinkel' moet voorstellen en ik maak gebruik van sqlite3 voor het opslaan en ophalen van data.

Nu ben ik al 2 weken bezig met het opstellen van de connectie en correct implementeren van de database en het is eindelijk gelukt. Het programma kan data schrijven in de database en ik kan ook data uit de database op het scherm tonen.

Wat niet lukt is data ophalen in 'TEXT' vorm en ze dan omzetten in een string om er gebruik van te maken in de code.

Op de website staat dit stuk code om sql uit te voeren en de data op het scherm te tonen:

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
01  #include <stdio.h>
02  #include <sqlite3.h>
03  
04  static int callback(void *NotUsed, int argc, char **argv, char **azColName){
05    int i;
06    for(i=0; i<argc; i++){
07      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
08    }
09    printf("\n");
10    return 0;
11  }
12  
13  int main(int argc, char **argv){
14    sqlite3 *db;
15    char *zErrMsg = 0;
16    int rc;
17  
18    if( argc!=3 ){
19      fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
20      exit(1);
21    }
22    rc = sqlite3_open(argv[1], &db);
23    if( rc ){
24      fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
25      sqlite3_close(db);
26      exit(1);
27    }
28    rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
29    if( rc!=SQLITE_OK ){
30      fprintf(stderr, "SQL error: %s\n", zErrMsg);
31      sqlite3_free(zErrMsg);
32    }
33    sqlite3_close(db);
34    return 0;
35  }


Ik kan hier dus echt niks van maken om de waarde van een tekstveld op te slaan als string. Na 5 dagen google te misbruiken kom ik dus hier hulp vragen. :'(

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Uh, ben je 't deel "om op 't scherm te tonen" vergeten :? Want dit doet niets anders dan een statement uitvoeren en evt. errors tonen.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
RobIII schreef op dinsdag 16 augustus 2011 @ 15:51:
Uh, ben je 't deel "om op 't scherm te tonen" vergeten :?
Nee, dat gebeurt wel degelijk, in callback(). sql_exec() zou de callback voor elke (resultaat)regel moeten aanroepen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Als je dit tooltje in je debugger aanroept met een geldige databasenaam en een query die iets ophaalt uit een tabel kun je met een breakpoint in callback zien wat je terugkrijgt.

Dat zijn dus twee arrays met pointers naar waarden resp kolomnamen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MSalters schreef op dinsdag 16 augustus 2011 @ 16:00:
[...]

Nee, dat gebeurt wel degelijk, in callback(). sql_exec() zou de callback voor elke (resultaat)regel moeten aanroepen.
Ah, die had ik even niet gezien :X My bad.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ETzPliskin
  • Registratie: Januari 2003
  • Laatst online: 18:07

ETzPliskin

PS3 ID: Kretus

Topicstarter
farlane schreef op dinsdag 16 augustus 2011 @ 16:12:
Als je dit tooltje in je debugger aanroept met een geldige databasenaam en een query die iets ophaalt uit een tabel kun je met een breakpoint in callback zien wat je terugkrijgt.

Dat zijn dus twee arrays met pointers naar waarden resp kolomnamen.
Ja, maar die slaat precies de waarden op naar char-arrays? Vreemd dat die niet als strings kunnen worden opgeslaan:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        sql = "SELECT Naam FROM Gebruikers WHERE Naam = " + gebruikersnaam + ";";
        sqlite3_stmt *pStatement;
        if (sqlite3_prepare_v2(db, sql.c_str(), -1, &pStatement, 0) == SQLITE_OK)
        {
            int result = sqlite3_step(pStatement);
            if (result == SQLITE_ROW)
            {
                string gebruikersnaam ((char)sqlite3_column_text(pStatement, 0)+"\n");
                string wachtwoord = ((char)sqlite3_column_text(pStatement, 1)+"\n");
                admin = sqlite3_column_int(pStatement, 2);
                notLoggedIn = false;
                gebruiker->setGebruikersnaam(gebruikersnaam);
                gebruiker->setAdminRechten(admin);
                gebruiker->setWachtwoord(wachtwoord);
            }
            else
            {
                cout << endl << "Fout wachtwoord of gebruikersnaam, probeer opnieuw." << endl;
                system("PAUSE");
                notLoggedIn = true;
            }
        }
    }}


Dit doet niks. En het zal waarschijnlijk ook baggercode zijn :X

Edit: Deze code doet op zich geen controle ofzo, het gaat om het principe :)

[ Voor 24% gewijzigd door ETzPliskin op 16-08-2011 17:17 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
Huh? Whut? Kijk even naar de code die je zelf post dan :

C:
1
2
3
4
5
6
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
...
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
...
}


azColname is een array van pointers naar strings met daarin kolomnamen, argv is een array van pointers naar strings met daarin waarden ( als string dus ). Dat is toch precies wat je wilt?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • ETzPliskin
  • Registratie: Januari 2003
  • Laatst online: 18:07

ETzPliskin

PS3 ID: Kretus

Topicstarter
farlane schreef op dinsdag 16 augustus 2011 @ 17:55:
[...]

Huh? Whut? Kijk even naar de code die je zelf post dan :

C:
1
2
3
4
5
6
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
...
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
...
}


azColname is een array van pointers naar strings met daarin kolomnamen, argv is een array van pointers naar strings met daarin waarden ( als string dus ). Dat is toch precies wat je wilt?
Dat ik dat zelf nooit doorgehad heb :F 8)7 Ik ga het straks proberen...

* ETzPliskin schaamt zich diep... :$

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 17:39

Reptile209

- gers -

Nog even piepen over de keuze voor:
C:
1
notLoggedIn = false;

Waarom niet gewoon: isLoggedIn = true? Nu moet je een extra denkstap maken om de juiste status te achterhalen. Vriend zegt: ik kom wel niet bij je langs. Moet je nu wel of geen pils koudleggen? :)

tuurlijk ligt er bier koud, maar je snapt mijn punt hopelijk :+

Zo scherp als een voetbal!


  • ETzPliskin
  • Registratie: Januari 2003
  • Laatst online: 18:07

ETzPliskin

PS3 ID: Kretus

Topicstarter
farlane schreef op dinsdag 16 augustus 2011 @ 17:55:
[...]

Huh? Whut? Kijk even naar de code die je zelf post dan :

C:
1
2
3
4
5
6
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
...
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
...
}


azColname is een array van pointers naar strings met daarin kolomnamen, argv is een array van pointers naar strings met daarin waarden ( als string dus ). Dat is toch precies wat je wilt?
Ik heb het nu geprobeerd, maar het zijn geen pointers naar strings. Het zijn precies char arrays. Ik heb geprobeerd om alle pointers op te vangen in een zelfgemaakte callback, maar als ik er data uit wil lezen krijg ik enkel wat tekens (geen geheugenplaatsen ofzo)...

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 25-08 11:27
Kijk ook eens hier naar: http://www.codeproject.com/KB/database/CppSQLite.aspx

is een c++ wrapper om de sqlite library. In de tijd dat ik het gebruikte best bruikbaar.

  • ETzPliskin
  • Registratie: Januari 2003
  • Laatst online: 18:07

ETzPliskin

PS3 ID: Kretus

Topicstarter
Het is gelukt met dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    sqlite3_open("WebshopVDH.db", &db);
    
    sqlite3_stmt* pStatement;
    char* acQuery = sqlite3_mprintf(sql.c_str());
    int nError = sqlite3_prepare_v2(db, acQuery, -1, &pStatement, NULL);
    while (nError == SQLITE_OK && sqlite3_step(pStatement) == SQLITE_ROW)
    {
        string sFeed = (char*)sqlite3_column_text(pStatement,0);
        cout << sFeed << endl;
    }
    sqlite3_finalize(pStatement);
    sqlite3_free(acQuery);
    sqlite3_close(db);


Die laatste cout geeft een string weer! :D

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
ETzPliskin schreef op donderdag 18 augustus 2011 @ 14:00:
Ik heb het nu geprobeerd, maar het zijn geen pointers naar strings. Het zijn precies char arrays. Ik heb geprobeerd om alle pointers op te vangen in een zelfgemaakte callback, maar als ik er data uit wil lezen krijg ik enkel wat tekens (geen geheugenplaatsen ofzo)...
Ah, je spreekt alleen C++? :)

There you go:
C++:
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    for( int i=0; i<argc; i++){
        std::cout << std::string( azColName[i] ) << " = " << std::string( argv[i] ? argv[i] : "NULL" ) << "\n";
    }
    return 0;
}


Seriously, wat kennis van c strings, arrays en pointers is echt onontbeerlijk als je C++ schrijft.

[ Voor 5% gewijzigd door farlane op 18-08-2011 15:08 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • ETzPliskin
  • Registratie: Januari 2003
  • Laatst online: 18:07

ETzPliskin

PS3 ID: Kretus

Topicstarter
Het is nog maar mijn eerste 6 maanden programmeren hoor... :p

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1