Columnas de acceso SQLite C ++ por nombre
-
03-07-2019 - |
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?
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;
}