0

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

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

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

SQLite 接口的 C++ 中是否有任何类似的方法可用?

4

3 回答 3

2

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

旧答案 基本上你必须用sqlite3_column_name16or迭代列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;
}
于 2009-05-03T22:26:49.127 回答
2

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

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

Results = ...
std::cout << Results[colname];
std::cout << Results[anothercol];
于 2009-05-03T22:28:16.050 回答
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);
  }
}
于 2009-05-03T23:21:32.880 回答