Pregunta

¿Hay alguna forma de acceder a los resultados de SQLite por nombre de columna (como un mapa de C ++) en lugar de número de índice en C / C ++?

Por ejemplo, el acceso SQLite de Python permite el acceso al diccionario

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

¿Algún método similar disponible en C ++ para la interfaz de SQLite?

¿Fue útil?

Solución

Iría con Daniel para recomendar SQLAPI ++ en www.sqlapi.com - en http : //www.sqlapi.com/HowTo/fetch.html puede encontrar un ejemplo simple de búsqueda de campos por nombre. El ejemplo es un poco detallado, así que aquí hay un resumen de solo código:

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

Otros consejos

Si conoce el índice de los nombres de las columnas, simplemente cree una variable local para el índice de la columna como:

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

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

nueva respuesta http://www.sqlapi.com/ Esta biblioteca puede hacer lo que usted quiere.

respuesta anterior Básicamente, deberá iterar las columnas con sqlite3_column_name16 o sqlite3_column_name . Tendrá que comparar las cadenas que devuelven con la que desea buscar.

He usado esto, es MFC, pero te da la idea básica de lo que hay que hacer.

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top