SQLite C++按名称访问列

问题描述:

有没有办法通过列名(如C++ Map)访问SQLite结果而不是C/C++中的索引号?SQLite C++按名称访问列

例如,Python的SQLite的访问允许字典访问

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

任何类似的方法用C++提供用于SQLite的界面?

我与丹尼尔走在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); 
    } 
} 

较新的回答 http://www.sqlapi.com/这个库可能会做你想做的。

老答案 基本上你将不得不与sqlite3_column_name16sqlite3_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; 
} 

如果您知道列名的索引只需要创建一个局部变量的列索引,如:

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

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

不是很优雅... – 2009-05-03 22:31:15