Archive for the ‘C++’ Category

  1. 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!
  2. Hello, DAO(C++) World!

    Posted on 3月 28th, 2012 by cx20

    DAO(C++)

    DAO(Data Access Object)は、マイクロソフト社が開発した COM ベースの DBMS 接続用 API である。

    ソースコード(VC + DAO3.6 + Jet データベース)

    #include <stdio.h>
    #include <tchar.h>
    #import "dao360.dll" no_namespace rename("EOF", "daoEOF")
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
     
        _DBEnginePtr dbe("DAO.DBEngine.36");
        DatabasePtr db = dbe->OpenDatabase( _T("hello.mdb") );
        RecordsetPtr rs = db->OpenRecordset( _T("SELECT 'Hello, DAO(C++) World!' AS Message") );
     
        while ( !rs->daoEOF )
        {
            _variant_t var = rs->Fields->GetItem( 0L )->Value;
            _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
            rs->MoveNext();
        }
        rs->Close();
        db->Close();
        rs = NULL;
        db = NULL;
        dbe = NULL;
     
        CoUninitialize();
    }

    ソースコード(VC + DAO12.0 + ACE データベース)

    #include <stdio.h>
    #include <tchar.h>
    #import "acedao.dll" no_namespace rename("EOF", "aceEOF")
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
     
        _DBEnginePtr dbe("DAO.DBEngine.120");
        DatabasePtr db = dbe->OpenDatabase( _T("hello.accdb") );
        RecordsetPtr rs = db->OpenRecordset( _T("SELECT 'Hello, DAO(C++) World!' AS Message") );
     
        while ( !rs->aceEOF )
        {
            _variant_t var = rs->Fields->GetItem( 0L )->Value;
            _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
            rs->MoveNext();
        }
        rs->Close();
        db->Close();
        rs = NULL;
        db = NULL;
        dbe = NULL;
     
        CoUninitialize();
    }

    ソースコード(VC + DAO3.6 + ODBC + SQL Server)

    #include <stdio.h>
    #include <tchar.h>
    #import "dao360.dll" no_namespace rename("EOF", "daoEOF")
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
     
        _DBEnginePtr dbe("DAO.DBEngine.36");
        DatabasePtr db = dbe->OpenDatabase( _T(""), FALSE, FALSE, 
            _T("ODBC;Driver={SQL Server};SERVER=(local);DATABASE=master;")
            _T("UID=sa;PWD=P@assW0rd;") );
        RecordsetPtr rs = db->OpenRecordset( _T("SELECT 'Hello, DAO(C++) World!' AS Message") );
     
        while ( !rs->daoEOF )
        {
            _variant_t var = rs->Fields->GetItem( 0L )->Value;
            _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
            rs->MoveNext();
        }
        rs->Close();
        db->Close();
        rs = NULL;
        db = NULL;
        dbe = NULL;
     
        CoUninitialize();
    }

    ソースコード(VC + DAO3.6 + ODBC + Oracle)

    #include <stdio.h>
    #include <tchar.h>
    #import "dao360.dll" no_namespace rename("EOF", "daoEOF")
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
     
        _DBEnginePtr dbe("DAO.DBEngine.36");
        DatabasePtr db = dbe->OpenDatabase( _T(""), FALSE, FALSE, 
            _T("ODBC;Driver={Oracle in OraDb11g_home1};")
            _T("DBQ=ORCL;")
            _T("UID=scott;PWD=tiger;") );
        RecordsetPtr rs = db->OpenRecordset( _T("SELECT 'Hello, DAO(C++) World!' AS Message") );
        // パススルークエリの例(データベース側に依存する SQL を実行する場合)
        //RecordsetPtr rs = db->OpenRecordset( _T("SELECT 'Hello, DAO(C++) World!' AS Message FROM DUAL"), dbOpenSnapshot, dbSQLPassThrough );
     
        while ( !rs->daoEOF )
        {
            _variant_t var = rs->Fields->GetItem( 0L )->Value;
            _tprintf( _T("%sn"), (LPCTSTR)(_bstr_t)var );
            rs->MoveNext();
        }
        rs->Close();
        db->Close();
        rs = NULL;
        db = NULL;
        dbe = NULL;
     
        CoUninitialize();
    }

    コンパイル方法

    C:¥> cl hello.cpp

    実行結果

    Hello, DAO(C++) World!
  3. Hello, C++/CLI World!

    Posted on 1月 19th, 2012 by cx20

    C++/CLI

    C++/CLI は C++ で .NET Framework を使用できるようにした、比較的新しい言語仕様である。Visual C++ 2005 より導入された。
    C++ の構文が使える他、.NET Framework のライブラリが使用できる。

    ソースコード

    #include <iostream>
     
    using namespace std;
     
    int main( int argc, char* argv[] )
    {
        cout << "Hello, C++/CLI World!" << endl;
        return 0;
    }

    ソースコード(.NET のライブラリを使用した場合)

    #using <mscorlib.dll>
     
    using namespace System;
     
    int main( array<String ^> ^args )
    {
        Console::WriteLine( "Hello, C++/CLI World!" );
        return 0;
    }

    コンパイル方法(Visual C++)

    C:¥> cl /clr hello.cpp

    実行結果

    Hello, C++/CLI World!
  4. Hello, C++ World!

    Posted on 12月 2nd, 2011 by cx20

    C++

    C++ は C言語にオブジェクト指向的な拡張した言語。開発当初は「C with Classes」(クラス付きのC言語)と呼ばれていた。「++」は C言語のインクリメント演算子に由来する。

    ソースコード

    #include <iostream>
     
    using namespace std;
     
    int main( int argc, char* argv[] )
    {
        cout << "Hello, C++ World!" << endl;
        return 0;
    }

    コンパイル方法(UNIX C++ コンパイラ)

    $ CC -o hello hello.cpp

    コンパイル方法(GNU C++ コンパイラ)

    $ g++ -o hello hello.cpp

    コンパイル方法(LLVM Clang++ コンパイラ)

    $ clang++ -o hello hello.cpp

    コンパイル方法(Visual C++)

    C:¥> cl hello.cpp

    実行結果

    Hello, C++ World!