Archive for the ‘library’ Category
-
Hello, ODP.NET World!
Posted on 4月 3rd, 2012 by cx20
ODP.NET
ODP.NET(Oracle Data Provider for .NET)は、.NET ベースの Oracle Database 接続用 API である。ODAC(Oracle Data Access Component)と呼ばれるパッケージに含まれる。
.NET 環境での Oracle Database 用データプロバイダとしては、マイクロソフト社が提供する「Microsoft Oracle Client」とオラクル社が提供する「ODP.NET」があるが、現在、「Microsoft Oracle Client」はマイクロソフト社自身が非推奨としており、今後は ODP.NET の使用が推奨されている。データプロバイダ 説明 System.Data.OracleClient .NET Framework Data Provider for Oracle Oracle.DataAccess.Client Oracle Data Provider for .NET ソースコード(C# + ODP.NET + Oracle)
using System; using Oracle.DataAccess.Client; class Hello { static void Main( String[] args ) { string conStr = "Data Source=ORCL;" + "User Id=scott;" + "Password=tiger"; string sqlStr = "SELECT 'Hello, ODP.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#)
C:¥> csc /r:Oracle.DataAccess.dll Hello.cs
実行結果
MESSAGE --------------------- Hello, ODP.NET World!
-
Hello, oo4o World!
Posted on 4月 2nd, 2012 by cx20
oo4o
oo4o(Oracle Objects for OLE)は、COM ベースの Oracle Database 接続用 API である。
Windows 環境で VB による開発に用いられることが多い。
ソースコード(VBScript + oo4o + Oracle)
Option Explicit Call Main() Sub Main() Dim ses Dim db Dim rs Set ses = CreateObject("OracleInProcServer.XOraSession") Set db = ses.OpenDatabase( "ORCL", "scott/tiger", 0 ) Set rs = db.CreateDynaset( "SELECT 'Hello, oo4o World!' AS Message FROM DUAL", 4) While NOT rs.EOF WScript.Echo rs(0).Name WScript.Echo "------------------" WScript.Echo rs(0).Value rs.MoveNext Wend End Sub
実行方法(Windows)
C:¥> CScript //Nologo Hello.vbs
実行結果
MESSAGE ------------------ Hello, oo4o World!
-
Hello, Pro*C/C++ World!
Posted on 4月 1st, 2012 by cx20
Pro*C/C++
Pro*C/C++ は Oracle Database に対応した C/C++ 用の埋め込み SQL(Embedded SQL)である。類似の製品としては、Pro*COBOL、Pro*FORTRAN、Pro*Pascal 等がある。Pro*C/C++ は、UNIX 環境で C/C++ を用いた開発に使用されることが多い。
なお、埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。ソースコード
#include <stdio.h> EXEC SQL INCLUDE SQLCA; int main( int argc, char* argv[] ) { EXEC SQL BEGIN DECLARE SECTION; char username[] = "scott"; char password[] = "tiger"; char message[32]; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT :username IDENTIFIED BY :password; EXEC SQL DECLARE C1 CURSOR FOR SELECT 'Hello, Pro*C/C++ World!' AS Message FROM DUAL; EXEC SQL OPEN C1; EXEC SQL WHENEVER NOT FOUND DO BREAK; for (;;) { EXEC SQL FETCH C1 INTO :message; printf("Messagen"); printf("-----------------------n"); printf("%sn", message); } EXEC SQL CLOSE C1; EXEC SQL COMMIT RELEASE; return 0; }
上記コードは、proc プリプロセッサにより、以下の C言語のコードが生成される。
ソースコード
/* Result Sets Interface */ #ifndef SQL_CRSR # define SQL_CRSR struct sql_cursor { unsigned int curocn; void *ptr1; void *ptr2; unsigned int magic; }; typedef struct sql_cursor sql_cursor; typedef struct sql_cursor SQL_CURSOR; #endif /* SQL_CRSR */ /* Thread Safety */ typedef void * sql_context; typedef void * SQL_CONTEXT; /* Object support */ struct sqltvn { unsigned char *tvnvsn; unsigned short tvnvsnl; unsigned char *tvnnm; unsigned short tvnnml; unsigned char *tvnsnm; unsigned short tvnsnml; }; typedef struct sqltvn sqltvn; struct sqladts { unsigned int adtvsn; unsigned short adtmode; unsigned short adtnum; sqltvn adttvn[1]; }; typedef struct sqladts sqladts; static struct sqladts sqladt = { 1,1,0, }; /* Binding to PL/SQL Records */ struct sqltdss { unsigned int tdsvsn; unsigned short tdsnum; unsigned char *tdsval[1]; }; typedef struct sqltdss sqltdss; static struct sqltdss sqltds = { 1, 0, }; /* File name & Package Name */ struct sqlcxp { unsigned short fillen; char filnam[9]; }; static const struct sqlcxp sqlfpn = { 8, "hello.pc" }; static unsigned int sqlctx = 18323; static struct sqlexd { unsigned int sqlvsn; unsigned int arrsiz; unsigned int iters; unsigned int offset; unsigned short selerr; unsigned short sqlety; unsigned int occurs; const short *cud; unsigned char *sqlest; const char *stmt; sqladts *sqladtp; sqltdss *sqltdsp; void **sqphsv; unsigned int *sqphsl; int *sqphss; void **sqpind; int *sqpins; unsigned int *sqparm; unsigned int **sqparc; unsigned short *sqpadto; unsigned short *sqptdso; unsigned int sqlcmax; unsigned int sqlcmin; unsigned int sqlcincr; unsigned int sqlctimeout; unsigned int sqlcnowait; int sqfoff; unsigned int sqcmod; unsigned int sqfmod; void *sqhstv[4]; unsigned int sqhstl[4]; int sqhsts[4]; void *sqindv[4]; int sqinds[4]; unsigned int sqharm[4]; unsigned int *sqharc[4]; unsigned short sqadto[4]; unsigned short sqtdso[4]; } sqlstm = {12,4}; /* SQLLIB Prototypes */ extern void sqlcxt (void **, unsigned int *, struct sqlexd *, const struct sqlcxp *); extern void sqlcx2t(void **, unsigned int *, struct sqlexd *, const struct sqlcxp *); extern void sqlbuft(void **, char *); extern void sqlgs2t(void **, char *); extern void sqlorat(void **, unsigned int *, void *); /* Forms Interface */ static const int IAPSUCC = 0; static const int IAPFAIL = 1403; static const int IAPFTL = 535; extern void sqliem(unsigned char *, signed int *); static const char *sq0002 = "select 'Hello, Pro*C World!' Message from DUAL "; typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; typedef struct { unsigned short len; unsigned char arr[1]; } varchar; /* cud (compilation unit data) array */ static const short sqlcud0[] = {12,4130,838,0,0, 5,0,0,0,0,0,27,12,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,10,0,0,1,10,0,0, 36,0,0,2,59,0,9,15,0,0,0,0,0,1,0, 51,0,0,2,0,0,13,19,0,0,1,0,0,1,0,2,97,0,0, 70,0,0,2,0,0,15,24,0,0,0,0,0,1,0, 85,0,0,3,0,0,30,25,0,0,0,0,0,1,0, }; #include <stdio.h> /* EXEC SQL INCLUDE SQLCA; */ #ifndef SQLCA #define SQLCA 1 struct sqlca { /* ub1 */ char sqlcaid[8]; /* b4 */ int sqlabc; /* b4 */ int sqlcode; struct { /* ub2 */ unsigned short sqlerrml; /* ub1 */ char sqlerrmc[70]; } sqlerrm; /* ub1 */ char sqlerrp[8]; /* b4 */ int sqlerrd[6]; /* ub1 */ char sqlwarn[8]; /* ub1 */ char sqlext[8]; }; #ifndef SQLCA_NONE #ifdef SQLCA_STORAGE_CLASS SQLCA_STORAGE_CLASS struct sqlca sqlca #else struct sqlca sqlca #endif #ifdef SQLCA_INIT = { {'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' '}, sizeof(struct sqlca), 0, { 0, {0}}, {'N', 'O', 'T', ' ', 'S', 'E', 'T', ' '}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0, 0} } #endif ; #endif #endif /* end SQLCA */ int main( int argc, char* argv[] ) { /* EXEC SQL BEGIN DECLARE SECTION; */ char username[] = "scott"; char password[] = "tiger"; char message[32]; /* EXEC SQL END DECLARE SECTION; */ /* EXEC SQL CONNECT :username IDENTIFIED BY :password; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 12; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )10; sqlstm.offset = (unsigned int )5; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqhstv[0] = ( void *)username; sqlstm.sqhstl[0] = (unsigned int )0; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( void *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned int )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqhstv[1] = ( void *)password; sqlstm.sqhstl[1] = (unsigned int )0; sqlstm.sqhsts[1] = ( int )0; sqlstm.sqindv[1] = ( void *)0; sqlstm.sqinds[1] = ( int )0; sqlstm.sqharm[1] = (unsigned int )0; sqlstm.sqadto[1] = (unsigned short )0; sqlstm.sqtdso[1] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlstm.sqlcmax = (unsigned int )100; sqlstm.sqlcmin = (unsigned int )2; sqlstm.sqlcincr = (unsigned int )1; sqlstm.sqlctimeout = (unsigned int )0; sqlstm.sqlcnowait = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } /* EXEC SQL DECLARE C1 CURSOR FOR SELECT 'Hello, Pro*C/C++ World!' AS Message FROM DUAL; */ /* EXEC SQL OPEN C1; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 12; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.stmt = sq0002; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )36; sqlstm.selerr = (unsigned short)1; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqcmod = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } /* EXEC SQL WHENEVER NOT FOUND DO BREAK; */ for (;;) { /* EXEC SQL FETCH C1 INTO :message; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 12; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )51; sqlstm.selerr = (unsigned short)1; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlstm.sqfoff = ( int )0; sqlstm.sqfmod = (unsigned int )2; sqlstm.sqhstv[0] = ( void *)message; sqlstm.sqhstl[0] = (unsigned int )32; sqlstm.sqhsts[0] = ( int )0; sqlstm.sqindv[0] = ( void *)0; sqlstm.sqinds[0] = ( int )0; sqlstm.sqharm[0] = (unsigned int )0; sqlstm.sqadto[0] = (unsigned short )0; sqlstm.sqtdso[0] = (unsigned short )0; sqlstm.sqphsv = sqlstm.sqhstv; sqlstm.sqphsl = sqlstm.sqhstl; sqlstm.sqphss = sqlstm.sqhsts; sqlstm.sqpind = sqlstm.sqindv; sqlstm.sqpins = sqlstm.sqinds; sqlstm.sqparm = sqlstm.sqharm; sqlstm.sqparc = sqlstm.sqharc; sqlstm.sqpadto = sqlstm.sqadto; sqlstm.sqptdso = sqlstm.sqtdso; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); if (sqlca.sqlcode == 1403) break; } printf("Messagen"); printf("-----------------------n"); printf("%sn", message); } /* EXEC SQL CLOSE C1; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 12; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )70; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } /* EXEC SQL COMMIT RELEASE; */ { struct sqlexd sqlstm; sqlstm.sqlvsn = 12; sqlstm.arrsiz = 4; sqlstm.sqladtp = &sqladt; sqlstm.sqltdsp = &sqltds; sqlstm.iters = (unsigned int )1; sqlstm.offset = (unsigned int )85; sqlstm.cud = sqlcud0; sqlstm.sqlest = (unsigned char *)&sqlca; sqlstm.sqlety = (unsigned short)4352; sqlstm.occurs = (unsigned int )0; sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn); } return 0; }
コンパイル&リンク方法(Visual C++)
C:¥> SET PATH=ORACLE_BASEORACLE_HOMEbin;%PATH% C:¥> SET INCLUDE=ORACLE_BASEORACLE_HOMEprecomppublic;%INCLUDE% C:¥> SET LIB=ORACLE_BASEORACLE_HOMEprecomplib;%LIB% C:¥> proc hello.pc C:¥> cl hello.c /link orasql11.lib
実行結果
Message ----------------------- Hello, Pro*C/C++ World!
-
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!
-
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!
-
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!
-
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!
-
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!
-
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!
-
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!