マイクロソフトデータアクセスインタフェースの概要
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
サンプル・プログラム:
進化道標(朝から晩まで):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 ++);
}