Colonnes d'accès SQLite C ++ par nom
-
03-07-2019 - |
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?
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;
}