tags:

views:

867

answers:

5

In C++, how can I establish an SQL connection to store data in an SQL database?

+2  A: 

IF you are targetting Windows, then you might want to use ODBC.

HS
And not just Windows -- ODBC is available on Unix and derivatives too.
Jonathan Leffler
+2  A: 

You should have a look at C preprocessors that exists traditionaly with databases (ecpg for postgres, Pro*C for oracle ... which lets you embed straight SQL directly in your source files) or an orginal system for mysql. ECPG will do with C++, that is/was not the case for some other preprocessors ...

PW
A: 

you could try wxSqlite with SQLite as Database. This offers you an open source connection header / c++ file to get started.

In general - you should get some kind of library that offers you the required functionality. All major DB vendors should offer at least a C library. Most of the time you get a C++ library or wrapper for the C one.

A: 

Use SQLAPI++ - it's cross platform and supports MS SQL Server, Oracle, Postgres and others. Very easy to use.

http://www.sqlapi.com/

Rob
and it's shareware
divideandconquer.se
A: 

If you targeting windows you can always use the import ability.

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename( "EOF", "EndOfFile" )

Then you could make a wrapper to deal with the SQL.

Little example, just to open close a connection

// H
class CExtAdoDatabase
{

public:
    CExtAdoDatabase( const char* p_cConnectString="", const char* p_cUsername="", const char* p_cPwd="" );
    virtual ~CExtAdoDatabase();

    bool Open( const char* p_cConnectString="", const char* p_cUsername="", const char* p_cPwd="" );
    bool Close();



private:
    HRESULT _hInitRes;
    bool _bIsValid;

    _ConnectionPtr *_p_pConnection;
};



// CPP
CExtAdoDatabase::CExtAdoDatabase( const char* p_cConnectString, const char* p_cUsername, const char* p_cPwd ) : _hInitRes( CoInitialize( NULL ))
{
    _p_pConnection = new _ConnectionPtr( "ADODB.Connection" );

    if( FAILED( _hInitRes ))
            _bIsValid = false;
    else
    {
     _bIsValid = true;
     (*_p_pConnection)->ConnectionTimeout=0;
     (*_p_pConnection)->CommandTimeout=0;

     if( p_cConnectString != NULL && strlen(p_cConnectString) )
     {
      _bstr_t scs( p_cConnectString );
      _bstr_t susr( p_cUsername );
      _bstr_t spwd( p_cPwd );
      (*_p_pConnection)->Open( scs, susr, spwd, NULL );
     }
    }
}
CExtAdoDatabase::~CExtAdoDatabase()
{
    Close();
    delete _p_pConnection;
    CoUninitialize();
}

bool CExtAdoDatabase::Open( const char* p_cConnectString, const char* p_cUsername, const char* p_cPwd )
{
    if(_bIsValid)
    {
     _bstr_t scs( p_cConnectString );
     _bstr_t susr( p_cUsername );
     _bstr_t spwd( p_cPwd );
     return ((*_p_pConnection)->Open( scs, susr, spwd, NULL ) == S_OK);
    }
    else
     return false;
}

bool CExtAdoDatabase::Close()
{
    if( _bIsValid )
    {
     if( (*_p_pConnection)->GetState() == adStateOpen )
      return !!(*_p_pConnection)->Close();
     else
      return true;
    }
    else
     return false;
}
João Augusto