Creare dinamicamente alcuni tipi di array e restituire quell'array come una raccolta di array

1

Ad esempio, ho una query di selezione del database che restituisce n colonne e non sapevo quante righe restituire (consente di chiamare x numero di righe restituite).

Codice di esempio (c ++ e SQLite):

while (sqlite3_step(res) == SQLITE_ROW)
    {
        printf("\nCOLUMN1 :%s", sqlite3_column_text(res, 0));
        printf("\nCOLUMN2 :%s", sqlite3_column_text(res, 1));
        printf("\nCOLUMN3 :%s", sqlite3_column_text(res, 2));
    }

Ora ho bisogno di creare un metodo per restituire questo risultato come qualsiasi formato specificato. Come implementare questo tipo di attività ? (es: utilizzo di strutture, array multidimensionali, ecc.)

Modificato: Ho fatto questo:

struct SELECTDATA
{
    const unsigned char* id;
    const unsigned char* deviceId;
    const unsigned char* deviceName;
};

vector<SELECTDATA> SQLiteHelperEx::GetData(string query)
{
    vector<SELECTDATA> vectorSelect;
    int status = sqlite3_prepare_v2(db, query.c_str(), query.size(), &res, &tail);
    const char* error_msg{ NULL };
    if (status != SQLITE_OK)
    {
        error_msg = sqlite3_errmsg(db);
        _(error_msg);
        sqlite3_finalize(res);
        sqlite3_close(db);
    }
    else {
        SELECTDATA data_{  NULL, NULL, NULL };  
        while (sqlite3_step(res) == SQLITE_ROW)
        {
            data_.id = sqlite3_column_text(res, 0);
            data_.deviceId = sqlite3_column_text(res, 1);           
            data_.deviceName = sqlite3_column_text(res, 2); 
            vectorSelect.push_back(data_);
        }

    }
    return vectorSelect;
}

Ma non so se il metodo è stato il metodo migliore o meno.

    
posta Elshan 01.07.2016 - 08:11
fonte

1 risposta

1

Ci sono alcune incognite qui per essere in grado di fornire una risposta più decaduta, quindi cercherò di suggerire una soluzione generica.

Prima di tutto, dovresti gestire diversi tipi di dati che la query SQL potrebbe restituire. Questo può essere fatto creando una classe di portacarte di tipo universale.

Successivamente, è possibile creare una struttura contenente una matrice dinamica bidimensionale della classe di supporto del tipo universale e due numeri interi, definendo la lunghezza di entrambe le dimensioni della matrice.

Ovviamente, questo significa che stai usando C ++, non usando STL, e non usando nessuna delle librerie più sofisticate che potrebbero rappresentare un recordset ottenuto da un database (ADO o qualcosa di simile).

Questo approccio è generico nel senso che potrebbe funzionare su tutte le query e tutti i tipi di dati. Ora, se si utilizzano i vettori, come si può vedere dalla domanda modificata, l'array bidimensionale non è necessario. La struttura contiene solo una matrice dinamica monodimensionale, che rappresenta una riga e un intero, che rappresenta la lunghezza della matrice. Questa è la soluzione generica.

Tuttavia, se si desidera avere una soluzione specializzata e codificata per quella particolare query, è sufficiente creare una struttura con un campo per ogni colonna in un recordset risultante e inserirlo in un vettore, come è stato fatto nell'esempio.

    
risposta data 01.07.2016 - 09:48
fonte

Leggi altre domande sui tag