2009-05-03 6 views
0

Existe-t-il un moyen d'accéder aux résultats SQLite par nom de colonne (comme une carte C++) au lieu du numéro d'index en C/C++?Colonnes d'accès SQLite C++ par nom

Par exemple, l'accès SQLite Python permet un accès dictionnaire

Results = Query("SELECT * FROM table"); 
print Results['colname'] 
print Results['anothercol'] 

Les méthodes similaires disponibles en C++ pour l'interface du SQLite?

Répondre

2

je partirais avec Daniel en recommandant SQLAPI ++ à www.sqlapi.com - - Au http://www.sqlapi.com/HowTo/fetch.html vous pouvez trouver un exemple simple d'extraction de champs par nom. L'exemple est un peu bavard alors voici un code seulement essentiel:

void showemps(SAConnection* pconn, int minage) 
{ 
    SACommand cmd(pconn, "select name, age from employees where age>:1"); 
    cmd << minage; 
    cmd.execute(); 
    while(cmd.FetchNext()) { 
    SAString sName = cmd.Field("name"); 
    long nAge = cmd.Field("age"); 
    printf("Name: %s, age: %d \n", sName, nAge); 
    } 
} 
2

nouvelle réponse http://www.sqlapi.com/ Cette bibliothèque peut faire ce que vous voulez.

ancienne réponse Fondamentalement, vous devrez parcourir les colonnes avec sqlite3_column_name16 ou sqlite3_column_name. Vous devrez comparer les cordes qui reviennent avec celle que vous voulez regarder.

J'ai utilisé ceci, son MFC, mais cela vous donne une idée de base de ce qu'il faut faire.

int CSQLite3Query::FieldIndex(const CString &field) 
{ 
    CheckVM(); 

    if (!field.IsEmpty()) 
    { 
     for (int nField = 0; nField < m_nCols; nField++) 
     { 
#ifdef UNICODE 
      CString sTemp = (LPCTSTR)sqlite3_column_name16(m_VM, nField); 
#else 
      CString sTemp = (LPCTSTR)sqlite3_column_name(m_VM, nField); 
#endif 
      if (sTemp == field) 
       return nField; 
     } 
    } 
    else 
    { 
     throw new CSQLite3Exception(MFCSQLITE3_ERROR, 
            MFCSQLITE3_INVALID_FIELD_NAME); 
    } 

    return -1; 
} 
2

Si vous connaissez l'index des noms de colonnes il suffit de créer une variable locale pour l'indice de colonne comme:

int colname = 0; 
int anothercol = 2; //just guessing ;-) 

Results = ... 
std::cout << Results[colname]; 
std::cout << Results[anothercol]; 
+0

Pas très élégant ... –

+0

Mais très efficace si vous n'avez pas besoin des noms de colonnes dynamiques :-) – lothar