2012-03-15 3 views
0

Я прочитал документацию и просмотрел примеры, но я до сих пор не могу понять, как назначить таблицу глобальной переменной в C++. Возможно, я немного испорчен. Я исхожу из python, и присвоение таблицы глобальной переменной действительно простое использование mysqldb.mysql ++ глобальная переменная таблицы

Можно ли назначить таблицу глобальной переменной, доступ к которой будет осуществляться за пределами класса mysqlpp?

В качестве примера, когда следующий код компилируется, я получаю ошибку: ошибка: «sched_recs» не был объявлен в этой области

#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"); 
    } 
    } 

} 

Если я вместо этого переместите цикл обратно в класс, то все работает нормально, но это ограничение. Это единственный способ сделать это? Кажется, что все примеры кажутся такими.

+0

Какая документация (ссылка будет приятной). –

+0

Похоже, что это делается через SSQLS, но смотри главу 5 [документация] (http://www.tangentsoft.net/mysql++/doc/html/userman/ssqls.html). Должен ли я определять член данных для каждого столбца SQL в таблице или только те, которые я хочу запросить? Документы показывают, что я должен определить один для каждого столбца в таблице: «который имеет член данных для каждого столбца SQL, используя те же имена». – nomadicME

+1

Обратите внимание, что вы указали 'mysqlpp :: StoreQueryResult sched_recs' внутри блока' try {} ', и поэтому, когда заканчивается блок, переменная выходит из области действия и не может использоваться вне блока try. Переместите цикл 'for' внутри блока' try {} 'или переместите объявление переменной перед блоком' try {} '. – Yaniro

ответ

0

Как предложил Яниро.

Попробуйте следующий фрагмент кода

#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"); 
    } 
    } 

} 

Отметим, что единственное различие в этом образце и тот, который вы Размещенное расположение декларации mysqlpp::StoreQueryResult переменной называется sched_recs.

В этом примере это объявлено в области основной, а не в области блока try, поэтому значение переменной по-прежнему находится в области видимости после завершения блока try.

Для получения дополнительной информации о области проверки и захвата блока см. Exception dangers and downsides.

+0

Спасибо @yaniro и Appleman1234 за вашу помощь. Это отлично работает. Какое облегчение, что материал SSQLS выглядел намного больше, чем мне нужно. Это поведение try/catch по отношению к области переменных сильно отличается от try/except в python. Еще раз спасибо. – nomadicME