Hello, ADO(C++) World!

Posted on 3月 29th, 2012 by cx20

ADO(C++)

ADO(ActiveX Data Objects)は、マイクロソフト社が開発した COM ベースの DBMS 接続用 API である。
OLE DB プロバイダを介することで様々な DBMS への接続が可能となっている。
OLE DB プロバイダとしては、以下のようなプロバイダがある。いくつかが OS 標準で付属している他、追加インストールが可能である。

プロバイダ名 表示名 説明
MSDASQL Microsoft OLE DB Provider for ODBC ODBC データベース
Microsoft.Jet.OLEDB.4.0 Microsoft OLE DB Provider for Microsoft Jet Microsoft Jet データベース
Microsoft.ACE.OLEDB.12.0 Microsoft Office 12.0 Access Database Engine OLE DB Provider Microsoft Access データベース
SQLOLEDB Microsoft OLE DB Provider for SQL Server Microsoft SQL Server
SQLNCLI10 SQL Server Native Client 10.0 Microsoft SQL Server
MSDAORA Microsoft OLE DB Provider for Oracle Oracle データベース

なお、Windows 7 SP1 より、ADO(msado15.dll)のインターフェイス ID(GUID)が変更されており、下位 OS との互換性がなくなっている。
これを回避する為には、msado15.dll の代わりに互換性のあるタイプライブラリ msado60.tlb を参照する必要がある。

ソースコード(VC + ADO + OLEDB + Jet データベース)

#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
    #import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
    #import "msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif
 
int _tmain( int argc, TCHAR* argv[] )
{
    CoInitialize(NULL);
 
    _ConnectionPtr  cn("ADODB.Connection");
    _RecordsetPtr   rs("ADODB.Recordset");
 
    cn->Open( _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Hello.mdb"), 
        _T(""), _T(""), adConnectUnspecified),
 
    rs = cn->Execute( _T("SELECT 'Hello, ADO(C++) World' AS Message"), NULL, adCmdText );
 
    while ( !rs->adoEOF )
    {
        _variant_t var = rs->Fields->GetItem( 0L )->Value;
        _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
        rs->MoveNext();
    }
    rs->Close();
    cn->Close();
    rs = NULL;
    cn = NULL;
 
    CoUninitialize();
 
    return 0;
}

ソースコード(VC + ADO + OLEDB + ACE データベース)

#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
    #import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
    #import "msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif
 
int _tmain( int argc, TCHAR* argv[] )
{
    CoInitialize(NULL);
 
    _ConnectionPtr  cn("ADODB.Connection");
    _RecordsetPtr   rs("ADODB.Recordset");
 
    cn->Open( _T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Hello.accdb"), 
        _T(""), _T(""), adConnectUnspecified),
 
    rs = cn->Execute( _T("SELECT 'Hello, ADO(C++) World' AS Message"), NULL, adCmdText );
 
    while ( !rs->adoEOF )
    {
        _variant_t var = rs->Fields->GetItem( 0L )->Value;
        _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
        rs->MoveNext();
    }
    rs->Close();
    cn->Close();
    rs = NULL;
    cn = NULL;
 
    CoUninitialize();
 
    return 0;
}

ソースコード(VC + ADO + OLEDB + SQL Server)

#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
    #import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
    #import "msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif
 
int _tmain( int argc, TCHAR* argv[] )
{
    CoInitialize(NULL);
 
    _ConnectionPtr  cn("ADODB.Connection");
    _RecordsetPtr   rs("ADODB.Recordset");
 
    cn->Open( _T("PROVIDER=SQLOLEDB;SERVER=(local);DATABASE=master;"), 
        _T("sa"), _T("P@ssW0rd"), adConnectUnspecified),
 
    rs = cn->Execute( _T("SELECT 'Hello, ADO(C++) World' AS Message"), NULL, adCmdText );
 
    while ( !rs->adoEOF )
    {
        _variant_t var = rs->Fields->GetItem( 0L )->Value;
        _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
        rs->MoveNext();
    }
    rs->Close();
    cn->Close();
    rs = NULL;
    cn = NULL;
 
    CoUninitialize();
 
    return 0;
}

ソースコード(VC + ADO + OLEDB + Oracle)

#include <stdio.h>
#include <tchar.h>
#if (WINVER >= 0x0601) // Windows 7 以降
    #import "msado60.tlb" no_namespace rename("EOF", "adoEOF")
#else
    #import "msado15.dll" no_namespace rename("EOF", "adoEOF")
#endif
 
int _tmain( int argc, TCHAR* argv[] )
{
    CoInitialize(NULL);
 
    _ConnectionPtr  cn("ADODB.Connection");
    _RecordsetPtr   rs("ADODB.Recordset");
 
    cn->Open( _T("PROVIDER=MSDAORA;DBQ=ORCL;"), 
        _T("scott"), _T("tiger"), adConnectUnspecified),
 
    rs = cn->Execute( _T("SELECT 'Hello, ADO(C++) World' AS Message FROM DUAL"), NULL, adCmdText );
 
    while ( !rs->adoEOF )
    {
        _variant_t var = rs->Fields->GetItem( 0L )->Value;
        _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
        rs->MoveNext();
    }
    rs->Close();
    cn->Close();
    rs = NULL;
    cn = NULL;
 
    CoUninitialize();
 
    return 0;
}

コンパイル方法

C:¥> cl hello.cpp

実行結果

Hello, ADO(C++) World!

Categories: ADO, C++, library

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

WP-SpamFree by Pole Position Marketing