Colunas de acesso SQLite C ++ por Nome
-
03-07-2019 - |
Pergunta
Existe uma maneira de resultados acesso SQLite por nome de coluna (como um Mapa C ++) em vez de número de índice em C / C ++?
Por exemplo, o acesso SQLite do Python permite o acesso dicionário
Results = Query("SELECT * FROM table");
print Results['colname']
print Results['anothercol']
Qualquer métodos similares disponíveis no C ++ para a interface do SQLite?
Solução
Eu iria com Daniel em recomendar SQLAPI ++ em www.sqlapi.com - em http : //www.sqlapi.com/HowTo/fetch.html pode encontrar um exemplo simples de buscar campos pelo nome. O exemplo é um pouco detalhado por isso aqui está uma essência só de 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);
}
}
Outras dicas
Se você sabe que o índice dos nomes de coluna apenas criar uma variável local para o índice da coluna como:
int colname = 0;
int anothercol = 2; //just guessing ;-)
Results = ...
std::cout << Results[colname];
std::cout << Results[anothercol];
resposta mais recente http://www.sqlapi.com/ Esta biblioteca pode fazer o que quer que seja.
velha resposta ??strong>
Basicamente, você terá que iterar as colunas com sqlite3_column_name16
ou sqlite3_column_name
. Você terá que comparar as cordas estes retorno com o que você deseja procurar.
Eu tenho usado essa, seu MFC, mas dá-lhe a idéia básica do que precisa ser feito.
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;
}