マイクロソフトデータアクセスインタフェースの概要


ADO、OLEDB、ODBCの関係:
進化道標(朝から晩まで):ODBC-OLE DB-DAO-RDO-ADO;
OSIモデル階層(絶対ではなく、部分的に交差している):最下層データソースであるODBC-OLE DB-RDO、DAO、ADO-アプリケーション.
一、ODBC
ODBCフルネームOpen Database Connectivity、ODBCは仕様(標準)のセットを確立し、データベースへのアクセスのための標準API関数インタフェースのセットを提供します.ODBCは、ODBCマネージャ、ODBC API、ODBCドライバマネージャ、ODBCデータベースドライバマネージャの4つの部分を含む.ODBCは、アプリケーション・ユーザーがODBCドライバを持つ任意のローカルまたはリモート・データ・ソースにアクセスできます.通常、SQL Server、Oracleなどのリレーショナル・データベースをアクセス・オブジェクトとして使用します.Microsoft Jet(.mdb)ベースのデータベースを使用している場合は、次のADOを使用するとMicrosoft Access ODBCドライバよりも効率的です.
二、OLEDB
OLE DBはCOM技術に基づく一連のインタフェース仕様であり、システムレベルのデータアクセスインタフェースであり、OLE DBは汎用データアクセス方式を提供し、データがどのような形式で格納されているかにかかわらず、電子メール、テキストファイル、複合ファイル、データテーブルなど様々なデータに対して統一的なインタフェースを通じてアクセスできる技術である.ORACLE、SQL Server、Access、Excelなど、さまざまなデータソースにアクセスできます.また、OLE DBのパフォーマンスは、以下のADO汎用データアクセス方式よりも向上しています.
三、DAO
DAO全称DATA ACCESS OBJECTSは、MICROSOFTに基づくJET技術設計であり、オブジェクト向けのデータアクセスインターフェースであり、最も早くVBで使用され、DAOがアクセスできるデータベースは以下の通りである.
1、データベースエンジンバージョンで1.x、2.xおよび3.0のMicrosoft AccessまたはMicrosoft Visual Basicによって作成された、Microsoft Jetデータベースエンジンを使用するデータベース.
2、インストール可能なISAMデータベース、dBASE III、dBASE IV、dBASE 5.0、Paradox 3を含む.x、4.xと5.x版.
3.オープンデータベース接続(ODBC)データベース.Microsoft SQL Server、SYBASE SQL Server、ORACLE Serverを含むが、これに限らない.ODBCデータベースにアクセスするには、アクセスするデータベースの適切なODBCドライバが必要です.
4、Microsoft Excel 3.0、4.0、5.0、7.0版ワークシート.
5、Lotus WKS、WK 1、WK 3、WK 4スプレッドシート.
6、テキストファイル.
四、RDO
RDO全称Remote Data Objects、翻訳はリモートデータオブジェクトアクセスであり、ODBCをベースにODBC API、選択したODBCドライバおよびバックエンドデータベースエンジンに依存して大部分の知能と機能を実現し、RDOは基本的なODBC処理方法を備えているため、多くのODBC API関数を直接実行することができる.RDOはDAOから派生しており,DAOと最大の違いはそのデータベース処理モードである.DAOはRecordsおよびFieldsに対してであり、RDOはRowsおよびColumnsに従って処理される.すなわちDAOはISAMモード,RDOはリレーショナルモードである.さらにDAOはAccessにアクセスするJetエンジン(JetはISAM)のインタフェースであり、RDOはODBCにアクセスするインタフェースである.RDOはDAO/Jet,ODBCなどの利点を統合していることがわかる.
五、ADO
ADO(ACTIVEX DATA OBJECTS)--ADOはOLE DB(ActiveX技術)技術に基づいて設計されたアプリケーション層データアクセスインタフェースであり、OLE DBインタフェースをカプセル化しているため、使用中は依然としてOLE DBを介してデータベースをブリッジしている.従って、ADOはOEL DBと同様に汎用データアクセス機能を提供し、リレーショナル・データベースと非リレーショナル・データベースへのアクセスをサポートする.ADO機能ではDAOとRDOを総合的に演繹しており,合併や最適化の取り消しなどがある.
 
実際の使用方法の説明:
実際の使用では,ADOを用いてリモート・データベースにアクセスする場合,性能が低く,わずか2万のデータ量でネットワークが危うくなると15分程度かかることが分かった.一方,OLEDBとODBCは,同じ条件下でそれぞれ6秒と5秒しかかからなかった.そのため、リモートアクセスであり、パフォーマンスが高い場合はODBCを推奨します.
ODBCドキュメントアドレス:http://msdn.microsoft.com/en-us/library/windows/desktop/ms714562(v=vs.85).aspx
サンプル・プログラム:
#include <sql.h> 
#include <sqlext.h>
#include <sqltypes.h> 
SQLHENV EnvironmentHandle;  
   RETCODE retcode = SQLAllocHandle( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvironmentHandle );     test_retcode( retcode, "SQLAllocHandle(Env) failed!" );    
   retcode = SQLSetEnvAttr( EnvironmentHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER );
   test_retcode( retcode, "SQLSetEnvAttr(ODBC version) Failed" ); 
   SQLHDBC ConnHandle;  
   retcode = SQLAllocHandle( SQL_HANDLE_DBC, EnvironmentHandle, &ConnHandle ); 
   test_retcode( retcode, "Could not allocate MS SQL 2005 connection handle." ); 
   SQLSMALLINT driver_out_length;
   retcode = SQLDriverConnect( ConnHandle,         NULL, // we're not interested in spawning a window    
    (SQLCHAR*) connectstring.c_str(),         SQL_NTS,         NULL,         0,         &driver_out_length,         SQL_DRIVER_NOPROMPT ); 
   test_retcode( retcode, "SQLConnect() Failed" );   
   SQLHSTMT StatementHandle; 
   retcode = SQLAllocHandle(SQL_HANDLE_STMT, ConnHandle, &StatementHandle); 
   test_retcode( retcode, "Failed to allocate SQL Statement handle." );     
   char* buffer = new char[ MAX_CHAR ];   
   SQLINTEGER length = MAX_CHAR - 1;      // -- Bind Block    
   retcode = SQLExecDirect( StatementHandle, (SQLCHAR*) "SELECT * FROM im_map_ip_op", SQL_NTS );   
   test_retcode( retcode, "SQLExecDirect failed." );      // -- Fetch Block  
   retcode = SQLBindCol( StatementHandle,  1,   SQL_C_CHAR,  (SQLPOINTER) NULL, (SQLINTEGER) SQL_DATA_AT_EXEC, &length );  

   test_retcode( retcode, "Failed to bind column." );     // -- End Bind Block   

   DWORD dw1 = GetTickCount();
   int index = 0;
   while(1)
   {
    retcode = SQLFetch( StatementHandle );    
    if ( retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_NO_DATA )     
    {   
     printf( "Problem fetching row.
" ); return 9; } if(retcode ==SQL_NO_DATA_FOUND) { printf( "span time=%d", GetTickCount() -dw1 ); return 9; } memset(buffer, 0x00, length); SQLGetData( StatementHandle, 1, SQL_C_CHAR, buffer, MAX_CHAR, &length ); printf ("index = %d\r
", index ++); }