Thursday, May 5, 2011

SQLite C++ Access Columns by Name

Is there a way to access SQLite results by column name (like a C++ Map) instead of index number in C/C++?

For example, Python's SQLite access allows dictionary access

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

Any similar methods available in C++ for the SQLite's interface?

From stackoverflow
  • newer answer http://www.sqlapi.com/ This library might do what you want it to.

    old answer Basically you will have to iterate the columns with sqlite3_column_name16 or sqlite3_column_name. You will have to compare the strings these return with the one you want to look up.

    I have used this, its MFC, but it gives you the basic idea of what needs done.

    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;
    }
    
  • If you know the index of the column names just create a local variable for the column index like:

    int colname = 0;
    int anothercol = 2; //just guessing ;-)
    
    Results = ...
    std::cout << Results[colname];
    std::cout << Results[anothercol];
    
    Daniel A. White : Not very elegant...
    lothar : But very efficient if you don't need dynamic column names :-)
  • I'd go with Daniel in recommending SQLAPI++ at www.sqlapi.com -- at http://www.sqlapi.com/HowTo/fetch.html you can find a simple example of fetching fields by name. The example is a bit verbose so here's a code-only gist:

    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);
      }
    }
    

0 comments:

Post a Comment