質問

C / C ++のインデックス番号ではなく、列名(C ++マップなど)でSQLiteの結果にアクセスする方法はありますか?

たとえば、PythonのSQLiteアクセスは辞書アクセスを許可します

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

SQLiteのインターフェース用にC ++で利用可能な同様のメソッドはありますか?

役に立ちましたか?

解決

ダニエルと一緒に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);
  }
}

他のヒント

列名のインデックスがわかっている場合は、次のような列インデックスのローカル変数を作成します。

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

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

新しい回答 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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top