C3Lab研究室

Back to Title Page(OpenLab)タイトルページへ戻る

最終更新日: 2001年 05月 28日 月曜日

JET Database 「CDAODB」 DAO Access の動作を動的に変更する
DAO3.5<−>DAO3.6


 MFC・CDaoDatabaseオブジェクトを利用すると簡単にDataBaseが利用可能です。

 

使用法など拡張された機能について

 このクラスの使用には「共有DLL」でコンパイル&リンクしなければなりません
これは、DAO3.6を動的に切り替えるのにMFCの静的ライブラリが使用できないためです。
また、動的に使用するデータベースDAOエンジンを切り替えるためAccess97/2000の両方のファイルの生成と操作を行えます。ただし、ファイルの生成以外はDAO3.6のモードで動作します。
DAO3.0/3.6モードはモジュールの組み込まれている環境以外では正常に動作しません。

Application Jet Version
Access 1.0 1.0
Access 1.1 1.1
Access 2.0 2.0/2.5
Access95 3.0
Access97 3.5 (DAO 3.5)
Access2000 4.0 (DAO 3.6)
Access2002(XP) ???
VB4.0-16bit 2.5
VB4.0-32bit 3.0
VB5.0 3.5
VB6.0 3.5
VC5.0 3.5
VC6.0 3.5/4.0(SP3)
Excel95 3.0
Excel97 3.5
Excel2000 4.0
PowerPoint97 3.5
Word97 3.5
Word2000 4.0
MS-Project 4.01 3.0
MS-Project 95 3.0
MS-Project 98 3.5
MS-Project 2000 4.0
MFC 4.x 3.0
MFC 5.0 3.5
MFC 6.0 3.5
MFC 6.01 3.6
IIS 3.0 3.5
SQL Server 6.5 3.5
SQL Server 7.0 4.0
SQL Server 2000 4.0
MSDE 1.0 4.0
MSDE 2000 4.0

VisualStudio6.0のJET4.0対応は標準で3.5になっているためMFCライブラリの再構築(MFC6.01)などが必要。ただし、動的に切り替える場合標準ライブラリ(MFC6.0)のまま動作の切り替えは可能。このクラスではそれを行っている。
ただし、JETモジュールなどの組み込みが別途使用するコンピュータ上に必要。

再配布時に必要なモジュール(2001/03/09現在でわかっている物)
VisualStudio6.0 ServicePack3対応以降のMFC42.DLLなどのMFCモジュールDAO350.DLL/DAO360.DLL(JET4.0)などのDAOモジュール
*MDAC2.5/JET4.0のランタイムのインストールにて対応

もしクライアントにAccess2000などの対象となるデータベースが組み込まれている場合はランタイムモジュールの組み込みは必要なし。

AccessXP(Access10)ではAccess2000
形式が標準のため、現在の所は問題ないが、Access2002フォーマットの新しいMDBが搭載されるらしいので、JETエンジンで対応するのか、ADOへの移行がなされるのか不透明。
標準的な使用ではAccess2000フォーマットのMDBなので大きな問題は発生しないものと思われる。
 


☆MFC6.0のDAO3.6標準対応化
 MFC6.0はDAO3.5が標準で設定されているため、
DAO3.6の使用にはまず、ServicePack3以降
のインストールののち、以下の手順でMFCのソースコードを
DAO3.6の使用を標準に設定。
 設定終了後、MFCの再構築を行えば、DAO3.6を標準
で使用するバージョンのMFCが出力される。
 MFC再構築後、アプリケーションなどをリビルドすればD
AO3.6を標準で使用するアプリケーションができあがる。

※この方法ではMFCを作成しなおすため、再配布の問題(D
LLHELLを含む)などが発生するためあまりお勧めではな
い。
 また、動的に変更するようにすれば、MFCの共有ライブラ
リーの配布問題も生じるが再配布可能モジュールのため、ライ
センスに従いモジュールの再配布を行うなどのケースでは、M
FC共有ライブラリーの使用がお勧め。


1:MFCのソースコードフォルダの中の「daocore.cpp」を開く
2:次のコード部分を探しだす(1000行目付近)

// Determine whether to use DAO 3.6, 3.5, or 3.0
// Use DAO 3.0 if DLL build and not built with MFC 4.21 or later
// Use DAO 3.6 if MFC 6.01 or later
// otherwise, DAO 3.5

3:下の2行を追加し、MFC6.01の再構築を行う
#undef _MFC_VER
#define _MFC_VER 0x0601
 

ヘッダーダウンロード
クラス  ダウンロード

#ifndef __CDAODB36_CLASS__
#define __CDAODB36_CLASS__

#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h>
#endif // _AFX_NO_DAO_SUPPORT

//#include "CStrObj.h"

//#include "cdaodb.h" // DAO3.5

//----------------------------------------------
class CDAODB36 : public CObject // CDAODB
{
public: // Overrided
// BOOL CanUpdateField (void);

public: // CreateFile
BOOL Create95 (LPCSTR filename, LPCTSTR lpszLocale = dbLangGeneral, int dwOptions = 0 ); // Access95データベースファイルを作成する(DAO3.0が利用可能な場合)
BOOL Create97 (LPCSTR filename, LPCTSTR lpszLocale = dbLangGeneral, int dwOptions = 0 ); // Access97データベースファイルを作成する(DAO3.5が利用可能な場合)
BOOL Create2K (LPCSTR filename, LPCTSTR lpszLocale = dbLangGeneral, int dwOptions = 0x40 ); // Access2000データベースファイルを作成する(DAO3.6が利用可能な場合)
public: // mode change
void SetMode95(void);
void SetMode97(void);
void SetMode2K(void);
public: // Constructor and Destructor
CDAODB36();
virtual ~CDAODB36();
//
};
#endif // __CDAODB_CLASS__

//----------------------------------------------------
// DAO Database access class for MFC CDao3.x
// 3.0/3.5/3.6 (Access95/97/2000) depend on system
// programmed Copyright (c) by kitaro 2001
//

#include "CDAODB36.h"

#ifndef _AFXDLL
#error Use DAO3.6 Applicaton have to USE MFC SHARED DLL (do not compile STATIC LINK LIBRARY MODE)
#else
//-----------------------------------------------------------------
BOOL CDAODB36::Create95 (LPCSTR filename, LPCTSTR lpszLocale , int dwOptions ){ // Access95データベースファイルを作成する
BOOL b;
SetMode95();
b=Create(filename,dbLangGeneral,dwOptions);
SetMode2K();
return b;
}
BOOL CDAODB36::Create97 (LPCSTR filename, LPCTSTR lpszLocale , int dwOptions ){ // Access97データベースファイルを作成する
BOOL b;
SetMode97();
b=Create(filename,dbLangGeneral,dwOptions);
SetMode2K();
return b;
}
BOOL CDAODB36::Create2K (LPCSTR filename, LPCTSTR lpszLocale , int dwOptions ){// Access2000データベースファイルを作成する
BOOL b;
SetMode2K();
b=Create(filename,dbLangGeneral,dwOptions);
return b;
}
////////////////////////////////////////////////////////////////
void CDAODB36::SetMode95(void){
::AfxGetModuleState()->m_dwVersion=0x0420; // MFC Module Version 4.20
::AfxDaoInit();
}
void CDAODB36::SetMode97(void){
::AfxGetModuleState()->m_dwVersion=0x0600; // MFC Module Version 6.00
::AfxDaoInit();
}
void CDAODB36::SetMode2K(void){
// MFC version should be 0x0601 (Dynamic Loading) for DAO 3.6
::AfxGetModuleState()->m_dwVersion=0x0601; // MFC Module Version 6.01
::AfxDaoInit();
}
////////////////////////////////////////////////////////////////
CDAODB36::CDAODB36(){
SetMode2K();
};
CDAODB36::~CDAODB36(){
Close();
SetMode97();
};
#endif // _AFXDLL
 

Copyright (C) Kitaro 2001