Domanda

Esiste un modo per accedere ai risultati di SQLite in base al nome della colonna (come una mappa C ++) anziché al numero di indice in C / C ++?

Ad esempio, l'accesso SQLite di Python consente l'accesso al dizionario

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

Esistono metodi simili disponibili in C ++ per l'interfaccia di SQLite?

È stato utile?

Soluzione

Andrei con Daniel a raccomandare SQLAPI ++ su www.sqlapi.com - a http : //www.sqlapi.com/HowTo/fetch.html puoi trovare un semplice esempio di recupero dei campi per nome. L'esempio è un po 'prolisso, quindi ecco un esempio di solo codice:

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

Altri suggerimenti

Se conosci l'indice dei nomi delle colonne, crea una variabile locale per l'indice delle colonne come:

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

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

risposta più recente http://www.sqlapi.com/ Questa libreria potrebbe fare ciò che desideri.

vecchia risposta Fondamentalmente dovrai iterare le colonne con sqlite3_column_name16 o sqlite3_column_name . Dovrai confrontare le stringhe che restituiscono con quella che vuoi cercare.

Ho usato questo, il suo MFC, ma ti dà l'idea di base di ciò che deve essere fatto.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top