C3Lab研究室

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

最終更新日: 1998年 10月 09日 金曜日

JET Database 「CDAODB」 DAO Access class Rel 3 (ver 1.00.100)

ダウンロードはこちら です


 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