Archive for 3月, 2012

  1. Hello, OCCI World!

    Posted on 3月 31st, 2012 by cx20

    OCCI

    OCCI(Oracle C++ Call Interface)は Oracle Database 用の C++ API である。

    ソースコード

    #include <iostream>
    #include <occi.h>
     
    using namespace std;
    using namespace oracle::occi;
     
    int main( int argc, char* argv[] )
    {
        Environment* env = Environment::createEnvironment();
        Connection* con = env->createConnection("scott", "tiger", "orcl");
     
        Statement* stmt = con->createStatement("SELECT 'Hello, OCCI World!' AS Message FROM DUAL");
        ResultSet* rs = stmt->executeQuery();
        while( rs->next() )
        {
            cout << rs->getString(1) << endl;
        }
        stmt->closeResultSet(rs);
        con->terminateStatement(stmt);
        env->terminateConnection(con);
        Environment::terminateEnvironment(env);
     
        return 0;
    }

    コンパイル&リンク方法(Visua C++)

    C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEociinclude;%INCLUDE%
    C:¥> SET LIB=ORACLE_BASEORACLE_HOMEocilibmsvc;%LIB%
    C:¥> cl hello.cpp /link oraocci11.lib

    実行結果

    Hello, OCCI World!
  2. Hello, OCI World!

    Posted on 3月 30th, 2012 by cx20

    OCI

    OCI(Oracle Call Interface)は Oracle Database 用の C API である。
    OCI 7.x とそれ以降では、関数セットが大きく異なっており、現在は、新しい関数セットを用いることが推奨されている。

    旧(7.x) 新(7.x以降) 説明
    opinit() OCIEnvCreate() 環境の作成
    olon() OCILogon() ログイン
    ologof() OCILogoff() ログオフ
    oparse() OCIStmtPrepare() SQL文の準備
    odefin() OCIDefineByPos() 項目と変数の関連付け
    oexec() OCIStmtExecute() SQL実行
    ofetch() OCIStmtFetch2() 結果セットより行を取得
    ocom() OCITransCommit() コミット
    orol() OCITransRollback() ロールバック

    なお、Windows に標準で導入されている Oracle 用のデータベースドライバとして以下のものがあるが、これらは、Oracle クライアントのバージョンとは無関係にOCI 7 API を呼び出す仕様の為、新しい機能を使う場合は、Oracle 社より提供されているドライバを使用する必要がある。

    ファイル 種類 説明
    MSORCL32.DLL ODBC ドライバ Microsoft ODBC for Oracle
    MSDAORA.DLL OLE DB プロバイダ Microsoft OLE DB Provider for Oracle

    ソースコード

    #include <stdio.h>
    #include <string.h>
    #include <oci.h>
     
    int main( int argc, char* argv[] )
    {
        sword status = OCI_SUCCESS;
        OCIEnv* envhp;
        OCIError* errhp;
        OCISvcCtx* svchp;
        OCIStmt* stmtp;
        OCIBind* bindp;
        OCIDefine* dfnp;
        char* username = "scott";
        char* password = "tiger";
        char* dbname = "orcl";
        char* stmt = "SELECT 'Hello, OCI World!' AS Message FROM DUAL";
        char message[64];
     
        OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0);
        OCIHandleAlloc(envhp, &errhp, OCI_HTYPE_ERROR, 0, 0);
        OCILogon(envhp, errhp, &svchp, username, strlen(username),
            password, strlen(password), dbname, strlen(dbname));
        OCIHandleAlloc(envhp, &stmtp, OCI_HTYPE_STMT, 0, 0);
        OCIStmtPrepare(stmtp, errhp, stmt, strlen(stmt), OCI_NTV_SYNTAX, OCI_DEFAULT);
        OCIDefineByPos(stmtp, &dfnp, errhp, 1, message, sizeof(message), SQLT_STR, 0, 0, 0, OCI_DEFAULT);
        OCIStmtExecute(svchp, stmtp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
     
        while ( status == OCI_SUCCESS )
        {
            printf("%sn", message);
            status = OCIStmtFetch2(stmtp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT);
        }
     
        OCIHandleFree(stmtp, OCI_HTYPE_STMT);
        OCILogoff(svchp, errhp);
        OCIHandleFree(errhp, OCI_HTYPE_ERROR);
     
        return 0;
    }

    コンパイル&リンク方法(Visua C++)

    C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEociinclude;%INCLUDE%
    C:¥> SET LIB=ORACLE_BASEORACLE_HOMEocilibmsvc;%LIB%
    C:¥> cl hello.c /link oci.lib

    実行結果

    Hello, OCI World!
  3. 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!
  4. 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!
  5. Hello, OLE DB(C++) World!

    Posted on 3月 27th, 2012 by cx20

    OLE DB(C++)

    OLE DB(Object Linking and Embedding Database)は、マイクロソフトが提唱した COM(Component Object Model)ベースの API 仕様である。
    OLE DB の概念は「OLE DB プロバイダ」(データ提供者)と「OLE DB コンシューマ」(データ消費者)からなる。(サーバーやクライアントという用語を使わないのは、n 層の場合に、必ずしもその意味にならない為。)
    データソースの差異は OLE DB プロバイダによって吸収される為、OLE DB コンシューマの手順にしたがってプログラムを作成すれば、基本的な差異を意識せず、プログラムすることができる。
    OLE DB プロバイダとしては、以下のようなプロバイダがある。

    プロバイダ名 表示名 説明
    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 データベース

    ソースコード(VC + OLE DB + Jet データベース)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicAccessor> rs;
     
        WCHAR szCon[] = L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=hello.mdb";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        rs.Open( ses, szSQL );
        while( rs.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( rs.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)rs.GetValue(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

    ソースコード(VC + OLE DB + ACE データベース)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicStringAccessor> cmd;
     
        WCHAR szCon[] = L"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=hello.accdb";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        cmd.Open( ses, szSQL );
     
        while( cmd.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( cmd.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)cmd.GetString(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

    ソースコード(VC + OLE DB + SQL Server)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicAccessor> rs;
     
        WCHAR szCon[] = L"PROVIDER=SQLOLEDB;SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        rs.Open( ses, szSQL );
        while( rs.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( rs.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)rs.GetValue(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

    ソースコード(VC + OLE DB + Oracle)

    #include <atldbcli.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CoInitialize(NULL);
        USES_CONVERSION;
     
        CDataSource ds;
        CSession ses;
        CCommand<CDynamicAccessor> rs;
     
        WCHAR szCon[] = L"PROVIDER=MSDAORA;Data Source=ORCL;User ID=scott;Password=tiger";
        WCHAR szSQL[] = L"SELECT 'Hello, OLE DB World!' AS Message FROM DUAL";
     
        ds.OpenFromInitializationString( szCon );
        ses.Open( ds );
        rs.Open( ses, szSQL );
        while( rs.MoveNext() == S_OK )
        {
            _tprintf( _T("%sn"), OLE2T( rs.GetColumnName(1) ) );
            _tprintf( _T("--------------------n") );
            _tprintf( _T("%sn"), (LPCTSTR)rs.GetValue(1) );
        }
        ses.Close();
        ds.Close();
     
        CoInitialize(NULL);
     
        return 0;
    }

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

    C:¥> cl hello.cpp

    実行結果

    Message
    --------------------
    Hello, OLE DB World!
  6. Hello, DAO(MFC) World!

    Posted on 3月 26th, 2012 by cx20

    DAO(MFC)

    MFC(Microsoft Foundation Class)は、Visual C++ 用のクラスライブラリである。
    MFC DAO クラスは、DAO(Data Access Object)のラップクラスとして実装されている。
    現在、DAO クラスは既存のアプリケーションの保守の為だけに残されており、新しいプロジェクトでは ODBC クラスが推奨されている。
    なお、x64 プラットフォームでは DAO クラスはサポートされておらず、コンパイルエラーとなる。

    ソースコード(VC + MFC + DAO + Jet データベース)

    #include <afx.h>
    #include <afxdao.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDaoDatabase db;
        db.Open( _T("hello.mdb") );
     
        CDaoRecordset rs( &db );
        CString strSQL = _T("SELECT 'Hello, DAO(MFC) World!' AS Message");
        rs.Open(dbOpenDynaset, strSQL, dbReadOnly);
     
        while ( !rs.IsEOF() )
        {
            COleVariant varValue = rs.GetFieldValue( 0 );
            _tprintf( _T("%sn"), V_BSTRT( &varValue ) );
            rs.MoveNext();
        }
     
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + DAO + ODBC + SQL Server)

    #include <afx.h>
    #include <afxdao.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDaoDatabase db;
        db.Open( _T(""), FALSE, FALSE, 
            _T("Driver={SQL Server};SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd") );
     
        CDaoRecordset rs( &db );
        CString strSQL = _T("SELECT 'Hello, DAO(MFC) World!' AS Message");
        rs.Open(dbOpenDynaset, strSQL, dbReadOnly);
     
        while ( !rs.IsEOF() )
        {
            COleVariant varValue = rs.GetFieldValue( 0 );
            _tprintf( _T("%sn"), V_BSTRT( &varValue ) );
            rs.MoveNext();
        }
     
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + DAO + ODBC + Oracle)

    #include <afx.h>
    #include <afxdao.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDaoDatabase db;
        db.Open( _T(""), FALSE, FALSE, 
            _T("ODBC;Driver={Oracle in OraDb11g_home1};DBQ=ORCL;UID=scott;PWD=tiger;") );
     
        CDaoRecordset rs( &db );
        CString strSQL = _T("SELECT 'Hello, DAO(MFC) World!' AS Message");
        rs.Open(dbOpenDynaset, strSQL, dbReadOnly);
     
        while ( !rs.IsEOF() )
        {
            COleVariant varValue = rs.GetFieldValue( 0 );
            _tprintf( _T("%sn"), V_BSTRT( &varValue ) );
            rs.MoveNext();
        }
     
        rs.Close();
        db.Close();
     
        return 0;
    }

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

    C:¥> cl hello.cpp

    実行結果

    Hello, DAO(MFC) World!
  7. Hello, ODBC(MFC) World!

    Posted on 3月 25th, 2012 by cx20

    ODBC(MFC)

    ODBC(Open Database Connectivity)は、マイクロソフト社が提唱した DBMS 接続用の API 仕様である。
    DBMS の差異は ODBC ドライバによって吸収される為、ODBC の手順にしたがってプログラムを作成すれば、基本的な差異を意識せず、プログラムすることができる。

    ODBCドライバ ファイル
    Microsoft Access Driver (*.mdb) ODBCJT32.DLL
    Microsoft Text Driver (*.txt; *.csv) ODBCJT32.DLL
    Microsoft Excel Driver (*.xls) ODBCJT32.DLL
    Microsoft dBase Driver (*.dbf) ODBCJT32.DLL
    Microsoft ODBC for Oracle MSORCL32.DLL
    Microsoft Paradox Driver (*.db ) ODBCJT32.DLL
    SQL Server SQLSRV32.DLL
    Microsoft Access Driver (*.mdb, *.accdb) ACEODBC.DLL
    SQL Server Native Client 10.0 SQLNCLI10.DLL

    MFC ODBC クラス は、Visual C++ の ODBC クラスライブラリである。

    ソースコード(VC + MFC + ODBC + Jet データベース)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={Microsoft Access Driver (*.mdb)};DBQ=hello.mdb");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + ACE データベース)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\hello.accdb");
        CString strSQL = _T("SELECT 'Hello, ODBC World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + SQL Server)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={SQL Server};SERVER=(local);DATABASE=master;UID=sa;PWD=P@ssW0rd");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + Oracle)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={Microsoft ODBC for Oracle};SERVER=ORCL;UID=scott;PWD=tiger");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message FROM DUAL");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

    ソースコード(VC + MFC + ODBC + MySQL)

    #include <afx.h>
    #include <afxdb.h>
     
    int _tmain( int argc, TCHAR* argv[] )
    {
        CDatabase db;
     
        CString strCon = _T("Driver={MySQL ODBC 5.1 Driver};Server=localhost;UID=root;PWD=P@ssW0rd");
        CString strSQL = _T("SELECT 'Hello, ODBC(MFC) World!' AS Message");
     
        db.OpenEx( strCon );
        CRecordset rs( &db );
        rs.Open( CRecordset::forwardOnly, strSQL );
     
        CString strMessage;
     
        while( !rs.IsEOF() )
        {
            rs.GetFieldValue( (short)0, strMessage );
            _tprintf( _T("%sn"), (LPCTSTR)strMessage );
            rs.MoveNext();
        }
        rs.Close();
        db.Close();
     
        return 0;
    }

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

    C:¥> cl hello.cpp

    実行結果

    Message
    Hello, ODBC(MFC) World!
  8. Hello, ADO.NET World!

    Posted on 3月 24th, 2012 by cx20

    ADO.NET

    ADO.NET(ActiveX Data Objects .NET)は、ADO の後継で .NET ベースの DBMS 接続用 API である。
    .NET データプロバイダを介することで様々な DBMS への接続が可能となっている。
    .NET Framework 標準で使用できる .NET データプロバイダとしては、以下のようなプロバイダがある。

    データプロバイダ名 説明
    System.Data.SqlClient Microsoft SQL Server
    System.Data.OleDb OLE DB
    System.Data.Odbc ODBC
    System.Data.OracleClient Oracle

    ソースコード(C# + ADO.NET + OLE DB + Jet データベース)

    using System;
    using System.Data.OleDb;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
                + "Data Source=hello.mdb";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            OleDbConnection con = new OleDbConnection(conStr);
            OleDbCommand  cmd = new OleDbCommand(sqlStr, con);
            con.Open();
            OleDbDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + OLE DB + ACE データベース)

    using System;
    using System.Data.OleDb;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Provider=Microsoft.ACE.OLEDB.12.0;"
                + "Data Source=.\hello.accdb";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            OleDbConnection con = new OleDbConnection(conStr);
            OleDbCommand  cmd = new OleDbCommand(sqlStr, con);
            con.Open();
            OleDbDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + SQL Server)

    using System;
    using System.Data.SqlClient;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "SERVER=(local);"
                + "DATABASE=master;"
                + "UID=sa;"
                + "PWD=P@ssW0rd";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            SqlConnection con = new SqlConnection(conStr);
            SqlCommand cmd = new SqlCommand(sqlStr, con);
            con.Open();
            SqlDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + Oracle)

    using System;
    using System.Data.OracleClient;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Data Source=ORCL;User ID=scott;Password=tiger";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message FROM DUAL";
     
            OracleConnection con = new OracleConnection(conStr);
            OracleCommand cmd = new OracleCommand(sqlStr, con);
            con.Open();
            OracleDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    ソースコード(C# + ADO.NET + ODBC + MySQL)

    using System;
    using System.Data.Odbc;
     
    class Hello
    {
        static void Main( String[] args )
        {
            string conStr = "Driver={MySQL ODBC 5.1 Driver};Server=localhost;UID=root;PWD=P@ssW0rd";
            string sqlStr = "SELECT 'Hello, ADO.NET World!' AS Message";
     
            OdbcConnection con = new OdbcConnection(conStr);
            OdbcCommand  cmd = new OdbcCommand(sqlStr, con);
            con.Open();
            OdbcDataReader reader = cmd.ExecuteReader();
            while( reader.Read() )
            {
                Console.WriteLine( reader.GetName(0) );
                Console.WriteLine( "---------------------" );
                Console.WriteLine( reader[0] );
            }
            reader.Close();
            con.Close();
        }
    }

    コンパイル方法(32bit OLE DB 使用時)

    C:¥> csc Hello.cs /platform:x86

    コンパイル方法(上記以外)

    C:¥> csc Hello.cs

    実行結果

    Message
    ---------------------
    Hello, ADO.NET World!
  9. Hello, ADO World!

    Posted on 3月 23rd, 2012 by cx20

    ADO

    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 データベース

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

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim cn
        Dim rs
     
        Set cn = CreateObject("ADODB.Connection")
        cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=.hello.mdb"
        Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        cn.Close
    End Sub

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

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim cn
        Dim rs
     
        Set cn = CreateObject("ADODB.Connection")
        cn.Open "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=.hello.accdb"
        Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
    End Sub

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

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim cn
        Dim rs
     
        Set cn = CreateObject("ADODB.Connection")
        cn.Open "PROVIDER=SQLOLEDB;" & _
             "SERVER=(local);DATABASE=master;", _
             "sa", "P@ssW0rd"
        Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        cn.Close
    End Sub

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

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim cn
        Dim rs
     
        Set cn = CreateObject("ADODB.Connection")
        cn.Open "PROVIDER=MSDAORA;Data Source=ORCL", "scott", "tiger"
        Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message FROM DUAL")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        cn.Close
    End Sub

    ソースコード(VBScript + ADO + ODBC + SQL Server)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim cn
        Dim rs
     
        Set cn = CreateObject("ADODB.Connection")
        cn.Open "PROVIDER=MSDASQL;Driver={SQL Server};" & _
            "SERVER=(local);DATABASE=master;", _
            "sa", "P@ssW0rd"
        Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        cn.Close
    End Sub

    ソースコード(VBScript + ADO + ODBC + Oracle)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim cn
        Dim rs
     
        Set cn = CreateObject("ADODB.Connection")
        cn.Open "PROVIDER=MSDASQL;Driver={Microsoft ODBC for Oracle};Server=ORCL", _
            "scott", "tiger"
        Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message FROM DUAL")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        cn.Close
    End Sub

    ソースコード(VBScript + ADO + ODBC + MySQL)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim cn
        Dim rs
     
        Set cn = CreateObject("ADODB.Connection")
        cn.Open "PROVIDER=MSDASQL;Driver={MySQL ODBC 5.1 Driver};Server=localhost", _
            "root", "P@ssW0rd"
        Set rs = cn.Execute("SELECT 'Hello, ADO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-------------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        cn.Close
    End Sub

    実行方法(Windows)

    C:¥> CScript //Nologo Hello.vbs

    実行結果

    Message
    -----------------
    Hello, ADO World!
  10. Hello, DAO World!

    Posted on 3月 22nd, 2012 by cx20

    DAO

    DAO(Data Access Object)は、マイクロソフト社が開発した COM ベースの DBMS 接続用 API である。
    主に Jet データベース(Access MDB)との接続に用いられるが、ODBC 経由で他の DBMS への接続も可能である。
    長い間 DAO は 32bit 版のみしか提供されていなかったが、DAO 12 より 64bit 版が提供されるようになった。

    クライアントアプリケーション データベースエンジン 推奨されるデータベース形式
    Access 2.0 Jet 2.0 *.mdb (Jet 2.0)
    Access 95 Jet 3.0 *.mdb (Jet 3.x)
    Access 97 Jet 3.5 *.mdb (Jet 3.x)
    Access 2000 Jet 4.0 *.mdb (Jet 4.x)
    Access 2002 Jet 4.0 *.mdb (Jet 4.x)
    Access 2003 Jet 4.0 *.mdb (Jet 4.x)
    Access 2007 ACE 12.0 (32bit) *.accdb (ACE 12.0)
    Access 2010 (32bit) ACE 12.0 (32bit) *.accdb (ACE 12.0)
    Access 2010 (64bit) ACE 12.0 (64bit) *.accdb (ACE 12.0)
    DAO 3.0 Jet 3.0 *.mdb (Jet 3.x)
    DAO 3.5 Jet 3.5 *.mdb (Jet 3.x)
    DA0 3.6 Jet 4.0 *.mdb (Jet 4.x)
    DA0 12 (32bit) ACE 12.0 (32bit) *.accdb (ACE 12.0)
    DA0 12 (64bit) ACE 12.0 (64bit) *.accdb (ACE 12.0)
    Microsoft.Jet.OLEDB.3.51 Jet 3.5 *.mdb (Jet 3.x)
    Microsoft.Jet.OLEDB.4.0 Jet 4.0 *.mdb (Jet 4.x)
    Microsoft.ACE.OLEDB.12.0 (32bit) ACE 12.0 (32bit) *.accdb (ACE 12.0)
    Microsoft.ACE.OLEDB.12.0 (64bit) ACE 12.0 (64bit) *.accdb (ACE 12.0)

    ソースコード(VBScript + DAO + Jet データベース)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim dbe
        Dim db
        Dim rs
     
        Set dbe = CreateObject("DAO.DBEngine.36")
        Set db = dbe.OpenDatabase("Hello.mdb")
        Set rs = db.OpenRecordset("SELECT 'Hello, DAO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-----------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        db.Close
    End Sub

    ソースコード(VBScript + DAO + ACE データベース)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim dbe
        Dim db
        Dim rs
     
        Set dbe = CreateObject("DAO.DBEngine.120")
        Set db = dbe.OpenDatabase("Hello.accdb")
        Set rs = db.OpenRecordset("SELECT 'Hello, DAO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-----------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
    End Sub

    ソースコード(VBScript + DAO + ODBC + SQL Server)

    Option Explicit
     
    Call Main()
     
    Sub Main()
        Dim dbe
        Dim db
        Dim rs
     
        Set dbe = CreateObject("DAO.DBEngine.36")
        Set db = dbe.OpenDatabase("", False, False, _
            "ODBC;Driver={SQL Server};" & _
            "SERVER=(local);DATABASE=master;" & _
            "UID=sa;PWD=P@ssW0rd;")
        Set rs = db.OpenRecordset("SELECT 'Hello, DAO World!' AS Message")
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-----------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        db.Close
    End Sub

    ソースコード(VBScript + DAO + ODBC + Oracle)

    Option Explicit
     
    Const dbOpenSnapshot = 4
    Const dbSQLPassThrough = 64
     
    Call Main()
     
    Sub Main()
        Dim dbe
        Dim db
        Dim rs
     
        Set dbe = CreateObject("DAO.DBEngine.36")
        Set db = dbe.OpenDatabase("", False, False, _
            "ODBC;Driver={Oracle in OraDb11g_home1};" & _
            "DBQ=ORCL;" & _
            "UID=scott;PWD=tiger;")
        Set rs = db.OpenRecordset("SELECT 'Hello, DAO World!' AS Message")
        ' パススルークエリの例(データベース側に依存する SQL を実行する場合)
        'Set rs = db.OpenRecordset("SELECT 'Hello, DAO World!' AS Message FROM DUAL", dbOpenSnapshot, dbSQLPassThrough)
     
        While Not rs.EOF
            WScript.Echo rs(0).Name
            WScript.Echo "-----------------"
            WScript.Echo rs(0).Value
            rs.MoveNext
        Wend
     
        rs.Close
        db.Close
    End Sub

    実行方法(Windows)

    C:¥> CScript //Nologo Hello.vbs

    実行結果

    Message
    -----------------
    Hello, DAO World!