有没有办法按列名称(如C ++ Map)访问SQLite结果而不是C / C ++中的索引号?
例如,Python的SQLite访问允许字典访问
Results = Query("SELECT * FROM table");
print Results['colname']
print Results['anothercol']
C ++中可用于SQLite接口的任何类似方法?
答案 0 :(得分:2)
较新的回答 http://www.sqlapi.com/此库可能会按您的意愿执行。
旧回答
基本上,您必须使用sqlite3_column_name16
或sqlite3_column_name
来迭代列。您必须将这些返回的字符串与您要查找的字符串进行比较。
我已经使用了它的MFC,但它为您提供了所需要的基本概念。
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;
}
答案 1 :(得分:2)
如果知道列名的索引,只需为列索引创建一个局部变量,如:
int colname = 0;
int anothercol = 2; //just guessing ;-)
Results = ...
std::cout << Results[colname];
std::cout << Results[anothercol];
答案 2 :(得分:2)
我会和Daniel一起在www.sqlapi.com推荐SQLAPI ++ - 在http://www.sqlapi.com/HowTo/fetch.html您可以找到一个按名称提取字段的简单示例。这个例子有点冗长,所以这里是一个只有代码的要点:
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);
}
}