最終更新日: 1998年 10月 09日 金曜日
ダウンロードはこちら です
MFC・CDaoDatabaseオブジェクトを利用すると簡単にDataBaseが利用可能です。
ファイルの使用はVC++のサンプルソースと共に含まれていますので、ダウンロード
後に自己解凍ファイルなので適切なディレクトリに展開してください。そののち、Developer
Studuioからプロジェクトを開いてください。
CDaoDatabaseを呼び出しているクラスは、 cdaodb.cpp と cdaodb.h の二つ
ですので、新規プロジェクトで実験する場合はこの二つをコピーして使用してください。
Rel2からの変更点は主に細かなデバッグと、メンバー関数のサポートの充実をメインに行い、メモリー内でのキャッシュやソートを行うキャッシュクラスを3種類拡張しました。
拡張の段階でキャッシュクラスは動的サイズやソートの高速化も考えたのですが、10万件単位でのソートを行わなければ当方ではそれほど時間がかからなかったため、今後の課題としておきます。
使用法
・メインとなる部分はR2までとおなじためそちらを参照してください。
・キャッシュクラスは今回の拡張ですので以下に仕様としてヘッダーを示します
![]() |
キャッシュクラスの作成。 |
![]() |
C++の定義の通りキャッシュクラスを生成。Createメンバーでしようする最大レコード数を登録し利用を開始します |
![]() |
データの登録はPush/PushNEメンバーで行います。Push系のメンバーはそのままデータを登録していきます PushNE系のメンバーは同じデータが以前登録されているかどうかをチェックします。 |
![]() |
ソートは void SortOneBegin(void); BOOL SortOne (void); BOOL SortOne1 (void); BOOL SortOne2 (void); ソートメンバーを初期化したのち、ループをデータの個数分だけ行います。一度の呼び出しで一つのデータをソートするだけです。理由は、状態表示を行うためにソート回数を確実にするためで、今後一括してソートを行うプログラムも予定していますが、10万件以上のデータの移動についてはメモリー上でさえも結構時間がかかるため現在はこの形をとっています。 |
![]() |
ソートはアルゴリズムとして使いやすいのですが遅いので、キャッシュデータを保存し後ほど再開するときやソートずみのデータを後で利用する場合などにセーブをしておくことができます。 |
![]() |
キャッシュデータの読み込みは、Createメンバーで最大レコードを指定する代わりにLoadメンバーでキャッシュデータファイルを読み込むことで元に戻せます。また、そのとき最大値もそのデータにあわせて再設定されます。 |
//-------------------------------------------
// DAO Database access class for MFC CDaoXXX
// Programmed & Copyright (c) by kitaro 1998
// Revision 1.30.100
#ifndef __CDAODB_CLASS__
#define __CDAODB_CLASS__
#include <afxdao.h>
class CDAODB ;
VOID CompactDAODB(void);
class CDAODBCash : public CObject {
typedef struct {
char
data[40];
char
data1[40];
char
data2[20];
}CashTree,*LPCashTree;
public:
long nMaxCount; // max cash buffers
long nCount;
public :
CashTree *root;
long sCount;
CDAODBCash();
virtual ~CDAODBCash();
public : // 継承Function
int
StrCmpLen (LPSTR src1,LPSTR src2); // String Function
//
先頭から一致する長さを返す
int
StrCmpLenEx (LPSTR src1,LPSTR src2); // String
Function
//
途中も含めて一致する最大文字数を返す
int
StrCmpStartEx(LPSTR src1,LPSTR src2);
//
途中も含めて一致する最大文字数の位置を返す
int
GetCount (void);
int
GetMaxCount (void);
public: // tree control
void Push
(LPSTR s,LPSTR d,LPSTR d2 = ""); // s,d(d2)の値を登録する
void PushNE
(LPSTR s,LPSTR d,LPSTR d2 = ""); // s
の値で2重登録を検査する
void PushNE1
(LPSTR s,LPSTR d,LPSTR d2 = ""); // d
の値で2重登録を検査する
void PushNE2
(LPSTR s,LPSTR d,LPSTR d2 = ""); // d2
の値で2重登録を検査する
LPSTR GetStr
(int n);
LPSTR GetStr1
(int n);
LPSTR GetStr2
(int n);
void SetStr
(int n,LPSTR p);
void SetStr1
(int n,LPSTR p);
void SetStr2
(int n,LPSTR p);
void SortOneBegin(void);
BOOL SortOne
(void);
BOOL SortOne1
(void);
BOOL SortOne2
(void);
long Search
(LPSTR szText);
BOOL Create
(int nMaxCount); // Create
and Initialize
BOOL Load
(LPSTR filename); // Status
Load
BOOL Save
(LPSTR filename); // Status
Save
private :
long StructSize(void);
};
//----------------------------------------------
class CDAODBCash2 : public CDAODBCash {
public:
typedef struct {
char
data[10];
char
data1[40];
}CashTree2,*LPCashTree2;
private:
// long nMaxCount; // max cash buffers
// long nCount;
public :
CashTree2 *root;
long sCount;
CDAODBCash2();
virtual ~CDAODBCash2();
public: // tree control
void Push
(LPSTR s,LPSTR d);
void Push2
(LPSTR s,LPSTR d);
void PushNE
(LPSTR s,LPSTR d);
void PushNE1
(LPSTR s,LPSTR d);
LPSTR GetStr
(int n);
LPSTR GetStr1
(int n);
void SetStr
(int n,LPSTR p);
void SetStr1
(int n,LPSTR p);
void SortOneBegin(void);
BOOL SortOne
(void);
BOOL SortOne1
(void);
long Search
(LPSTR szText);
// int
GetCount(void);
// int
GetMaxCount(void);
BOOL Create
(int nMaxCount); // Create
and Initialize
BOOL Load
(LPSTR filename); // Status
Load
BOOL Save
(LPSTR filename); // Status
Save
private :
long StructSize(void);
};
//----------------------------------------------
class CDAODBCash3 : public CDAODBCash {
public:
typedef struct {
char
data[10];
char
data1[10];
}CashTree2,*LPCashTree2;
private:
// long nMaxCount; // max cash buffers
// long nCount;
public :
CashTree2 *root;
long sCount;
CDAODBCash3();
virtual ~CDAODBCash3();
public: // tree control
void Push
(LPSTR s,LPSTR d);
void PushNE
(LPSTR s,LPSTR d);
void PushNE1
(LPSTR s,LPSTR d);
LPSTR GetStr
(int n);
LPSTR GetStr1
(int n);
void SetStr
(int n,LPSTR p);
void SetStr1
(int n,LPSTR p);
void SortOneBegin(void);
BOOL SortOne
(void);
BOOL SortOne1
(void);
long Search
(LPSTR szText);
// int
GetCount(void);
// int
GetMaxCount(void);
BOOL Create
(int nMaxCount); // Create
and Initialize
BOOL Load
(LPSTR filename); // Status
Load
BOOL Save
(LPSTR filename); // Status
Save
private :
long StructSize(void);
};
//----------------------------------------------
class CDAODB : public CObject
{
public : // other function
void ZipSJis2Asc (LPSTR
srcdest); // 全角郵便番号を半角へ、半角入力OK、7桁の場合ハイフン挿入
void SujiSJis2Asc (LPSTR
srcdest); // 全角数字(ハイフン)を半角へ、半角入力OK
void ZipSJis2Asc (LPSTR
src,LPSTR dest); // 全角郵便番号を半角へ、半角入力OK、7桁の場合ハイフン挿入
void SujiSJis2Asc (LPSTR
src,LPSTR dest); // 全角数字(ハイフン)を半角へ、半角入力OK
// 平仮名全角−>片仮名半角
void Hirakana2Hankaku(LPSTR srcdest);
void Hirakana2Hankaku(LPSTR src,LPSTR dest);
// ALL Hankaku
void AllHankaku(LPSTR srcdest);
void AllHankaku(LPSTR src,LPSTR dest);
private : // CDaoDatabase Object
CDaoDatabase *m_cdao;
CDaoTableDef *m_tbl;
CDaoRecordset *m_rs;
char szOrgFileName[_MAX_PATH];
private : //
BOOL bAppend; // Field Create
and need append function flg
public : // constructor / destructor
CDAODB();
~CDAODB();
public : // commondlg32 file
LPSTR File2Load( CWnd *lpcWnd );
LPSTR File2Save( CWnd *lpcWnd );
LPSTR File2Load( HWND hWnd );
LPSTR File2Save( HWND hWnd );
public : // Macro function
long Search (int
nFieldIndex ,LPCSTR szData);
long Search (LPCSTR
szFieldIndex,LPCSTR szData);
long SearchI(int nFieldIndex
,LPCSTR szData);
long SearchI(LPCSTR
szFieldIndex,LPCSTR szData);
long GetCurrentRecords
(void);
BOOL CkUpdateField
(LPSTR szFieldName,COleVariant c);
public : // CDaoDataBase
BOOL Create (LPCSTR filename,
LPCTSTR lpszLocale = dbLangGeneral, int dwOptions = 0 );
BOOL Open ( LPCTSTR lpszName,
BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T("") );
BOOL ReOpen ( BOOL bExclusive
= FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T("") );
void Close (void);
CDaoTableDef*
GetTable(void){return m_tbl;};
CDaoRecordset*
GetRecord(void){return m_rs;};
CString
GetVersion(void);
//------------------------------------------
short GetTableDefCount( void );
BOOL GetTableDefInfo( int nIndex,
CDaoTableDefInfo& tabledefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
BOOL GetTableDefInfo( LPCTSTR lpszName,
CDaoTableDefInfo& tabledefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
BOOL DeleteTableDef( LPCTSTR lpszName );
//------------------------------------------
BOOL CreateTable (LPCSTR
szTableName);
BOOL OpenTable
(LPCSTR szTableName);
BOOL CloseTable
(void);
BOOL AppendField (void);
// create reguler field functions
BOOL CreateField
(LPSTR lpszName,short nType , long lSize , long
lAttributes = 0);
BOOL CreateFieldStr
(LPSTR lpszName,long lSize = 255, long
lAttributes = dbVariableField);
BOOL CreateFieldDate (LPSTR
lpszName,long lAttributes = dbFixedField);
BOOL CreateFieldCurrency(LPSTR lpszName,long
lAttributes = dbFixedField);
BOOL CreateFieldBool (LPSTR
lpszName,long lAttributes = dbFixedField);
BOOL CreateFieldByte (LPSTR
lpszName,long lAttributes = dbFixedField);
BOOL CreateFieldInt
(LPSTR lpszName,long lAttributes =
dbFixedField);
BOOL CreateFieldLong (LPSTR
lpszName,long lAttributes = dbFixedField);
BOOL CreateFieldSingle (LPSTR
lpszName,long lAttributes = dbFixedField);
BOOL CreateFieldDouble (LPSTR
lpszName,long lAttributes = dbFixedField);
BOOL CreateFieldLB
(LPSTR lpszName,long lAttributes =
dbFixedField);
BOOL CreateFieldMemo (LPSTR
lpszName,long lAttributes = dbFixedField);
short FieldCount(void);
BOOL FieldInfo( int nIndex, CDaoFieldInfo&
fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
BOOL FieldInfo( LPCTSTR lpszName,
CDaoFieldInfo& fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
// create index
BOOL CreateIndex( CDaoIndexInfo& indexinfo
);
BOOL DeleteIndex( LPCTSTR lpszName);
BOOL DeleteIndex( int index);
BOOL CanUpdateTbl(void);
BOOL GetIndexInfo( int nIndex,
CDaoIndexInfo& indexinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
BOOL GetIndexInfo( LPCTSTR lpszName,
CDaoIndexInfo& indexinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
//------------------------------------------
// CDaoRecordset
BOOL OpenRecord(int nOpenType = dbOpenDynaset,
int nOptions = 0);
BOOL CloseRecord(void);
BOOL AddNew
(void); // pare w/Update function
BOOL AddNew
(CWnd *lpcWnd); // pare w/Update function
//
ページロックできない時に再施行します。またユーザーに問い合わせも行います
BOOL Update
(void);
BOOL CancelUpdate(void);
long GetCount (void);
// Get Record Count
BOOL Delete
(void); // current delete and
move first record automatically
BOOL Delete
(long n); // delete n position
BOOL Edit
(void);
BOOL Edit
(CWnd *lpcWnd); //
ページロックできない時に再施行します。またユーザーに問い合わせも行います
COleDateTime GetDateCreated(void);
COleDateTime GetDateLastUpdated(void);
// position function
long GetPos
(void); // Absolute Position
BOOL SetPos
(long lPos); // absolute position
float GetPerPos (void);
// Percent Position
// move function
BOOL Move
(long n);
BOOL MoveLast (void);
BOOL MoveFirst (void);
BOOL MovePrev (void);
BOOL MoveNext (void);
// status function
BOOL IsBOF
(void);
BOOL IsEOF
(void);
BOOL IsDeleted (void);
BOOL IsOpen
(void);
// Get field value function
BOOL Get
(LPCTSTR lpszName,
COleVariant& varValue );
BOOL Get
(int nIndex,
COleVariant& varValue );
short GetInt
(LPCSTR lpszName);
short GetInt
(int nIndex);
long GetLong
(LPCSTR lpszName);
long GetLong
(int nIndex);
float GetSingle
(LPCSTR lpszName);
float GetSingle
(int nIndex);
double GetDouble
(LPCSTR lpszName);
double GetDouble
(int nIndex);
LPSTR GetStr
(LPCSTR lpszName);
LPSTR GetStr
(int nIndex);
// Set field value function
BOOL Set (LPCTSTR lpszName,
const COleVariant& varValue);
BOOL Set (int nOrdinal, const
COleVariant& varValue);
BOOL Set (LPCTSTR lpszName,
LPCTSTR lpszValue );
BOOL Set (int nOrdinal,
LPCTSTR lpszValue );
BOOL Set (LPCTSTR lpszName,
short n );
BOOL Set (int nOrdinal, short
n );
BOOL Set (LPCTSTR lpszName,
long n );
BOOL Set (int nOrdinal, long
n );
BOOL Set (LPCTSTR lpszName,
float n );
BOOL Set (int nOrdinal, float
n );
BOOL Set (LPCTSTR lpszName,
double n );
BOOL Set (int nOrdinal,
double n );
BOOL SetNull (LPCTSTR
lpszName);
BOOL SetNull (int nOrdinal);
BOOL SetToday (LPCTSTR
lpszName);
BOOL SetToday (int nOrdinal);
BOOL SetDate (int nOrdinal
,int nY,int nM,int nD);
BOOL SetDate (LPCTSTR
lpszName,int nY,int nM,int nD);
BOOL SetDateOffset (int
nOrdinal ,int nY,int nM,int nD);
BOOL SetDateOffset (LPCTSTR
lpszName,int nY,int nM,int nD);
// Field Infomation
BOOL GetInfo(int nIndex, CDaoFieldInfo&
fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
BOOL GetInfo(LPCTSTR lpszName,
CDaoFieldInfo& fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
//
};
#endif // __CDAODB_CLASS__
// EOF
//-------------------------------------------
Copyright (C) Kitaro 1998