Question

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

Par exemple, l'accès SQLite de Python autorise l'accès au dictionnaire

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

Des méthodes similaires disponibles en C ++ pour l'interface de SQLite?

Était-ce utile?

La solution

Je recommanderais SQLAPI ++ à Daniel sur www.sqlapi.com - http : //www.sqlapi.com/HowTo/fetch.html , vous trouverez un exemple simple de récupération de champs par leur nom. L'exemple est un peu commenté alors voici un gist de code uniquement:

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

Autres conseils

Si vous connaissez l'index des noms de colonne, créez simplement une variable locale pour l'index de colonne, telle que:

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

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

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

ancienne réponse En gros, vous devrez itérer les colonnes avec sqlite3_nom_colonne16 ou sqlite3_nom_colonne . Vous devrez comparer les chaînes renvoyées par celui que vous souhaitez rechercher.

J'ai utilisé cela, son MFC, mais il vous donne une idée de base de ce qui doit être fait.

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top