2012-03-15 4 views
0

J'ai lu la documentation, et j'ai regardé les exemples, mais je n'arrive toujours pas à comprendre comment assigner une table à une variable globale en C++. Je pourrais être un peu gâté. Je viens de python et assigner une table à une variable globale est vraiment simple en utilisant mysqldb.mysql ++ variable de table globale

Une table peut-elle être affectée à une variable globale accessible en dehors de la classe mysqlpp?

À titre d'exemple, lorsque le code suivant est compilé, je reçois l'erreur: erreur: « sched_recs » n'a pas été déclarée dans ce champ

#include <mysql++.h> 
#include <string> 
#include <time.h> 

using namespace std; 
using namespace mysqlpp; 

int SSE (const char* timeStr) 
{ 
    time_t sse; 
    struct tm tm; 
    strptime(timeStr, "%Y-%m-%d %H:%M:%S", &tm); 
    sse = mktime(&tm); 
    return (sse); 
} 

int main() 
{ 
    string table = "sched_recs"; 
    time_t now, tt; 
    now = time(NULL); 

    try 
    { 
    // Connect to the sample database. 
    mysqlpp::Connection conn(false); 
    //    databasename, host, username, password 
    if (conn.connect("dbname", "dbhost", "dbusername", "dbpasswd")) { 
     // Retrieve a subset of the sample stock table set up by resetdb 
     // and display it. 
     //stmt = "select datetime from %s", table 
     mysqlpp::Query query = conn.query("select * from sched_recs"); 
     mysqlpp::StoreQueryResult sched_recs = query.store(); 
     //if (mysqlpp::StoreQueryResult tableData = query.store()) { 
      ////cout << "We have:" << endl; 

     //} 
    } 
    } 
    catch (Exception& e) 
    { 
    cerr << "Exception: " << e.what() << endl; 
    } 

    for (size_t i = 0; i < sched_recs.num_rows(); ++i) { 
    if (SSE(sched_recs[i][1]) - 60 * 3 < now && SSE(sched_recs[i][2]) > now) 
    { 
     cout << '\t' << sched_recs[i][1] << endl; 
     //system("at -f test.py '18:30' today"); 
    } 
    } 

} 

Si je me déplace à la place la boucle de retour dans la classe, alors tout fonctionne bien, mais c'est limitant. Est-ce la seule façon de le faire? Tous les exemples semblent le faire croire.

+0

Quelle documentation (un lien serait bien). –

+0

Il semble que cela soit fait via SSQLS, mais en regardant le chapitre 5 de la [documentation] (http://www.tangentsoft.net/mysql++/doc/html/userman/ssqls.html). Dois-je vraiment définir un membre de données pour chaque colonne SQL de la table ou seulement celles que je veux demander? Les docs donnent l'impression que je dois en définir un pour chaque colonne de la table: "qui a un membre de données pour chaque colonne SQL, en utilisant les mêmes noms". – nomadicME

+1

Veuillez noter que vous avez déclaré 'mysqlpp :: StoreQueryResult sched_recs' dans le bloc' try {} 'et que lorsque le bloc se termine, la variable sort de sa portée et ne peut pas être utilisée en dehors du bloc try. Déplacez la boucle 'for' dans le bloc' try {} 'ou déplacez la déclaration de variable avant le bloc' try {} '. – Yaniro

Répondre

0

Comme suggéré par Yaniro.

Essayez l'extrait de code suivant

#include <mysql++.h> 
#include <string> 
#include <time.h> 

using namespace std; 
using namespace mysqlpp; 

int SSE (const char* timeStr) 
{ 
    time_t sse; 
    struct tm tm; 
    strptime(timeStr, "%Y-%m-%d %H:%M:%S", &tm); 
    sse = mktime(&tm); 
    return (sse); 
} 

int main() 
{ 
    string table = "sched_recs"; 
    mysqlpp::StoreQueryResult sched_recs; 
    time_t now, tt; 
    now = time(NULL); 

    try 
    { 
    // Connect to the sample database. 
    mysqlpp::Connection conn(false); 
    //    databasename, host, username, password 
    if (conn.connect("dbname", "dbhost", "dbusername", "dbpasswd")) { 
     // Retrieve a subset of the sample stock table set up by resetdb 
     // and display it. 
     //stmt = "select datetime from %s", table 
     mysqlpp::Query query = conn.query("select * from sched_recs"); 
     sched_recs = query.store(); 
     //if (mysqlpp::StoreQueryResult tableData = query.store()) { 
      ////cout << "We have:" << endl; 

     //} 
    } 
    } 
    catch (Exception& e) 
    { 
    cerr << "Exception: " << e.what() << endl; 
    } 

    for (size_t i = 0; i < sched_recs.num_rows(); ++i) { 
    if (SSE(sched_recs[i][1]) - 60 * 3 < now && SSE(sched_recs[i][2]) > now) 
    { 
     cout << '\t' << sched_recs[i][1] << endl; 
     //system("at -f test.py '18:30' today"); 
    } 
    } 

} 

Notez que seule différence dans cet échantillon et celui que vous avez envoyé l'emplacement de la déclaration de la variable mysqlpp::StoreQueryResult appelée sched_recs.

Dans cet exemple, il est déclaré dans la portée de main, plutôt que dans la portée du bloc try, de sorte que la valeur de la variable est toujours visible après la fin du bloc try.

Pour plus d'informations sur try and catch bloc scope, voir Exception dangers and downsides.

+0

Merci @yaniro et Appleman1234 pour votre aide. Cela fonctionne très bien. Quel soulagement, ce truc de SSQLS ressemblait beaucoup plus à ce dont j'avais besoin. Ce comportement try/catch, par rapport à la portée variable, est très différent de try/except dans python. Merci encore. – nomadicME