VC++でカスタムデータベースクラスを作成する


VC++でカスタムデータベースクラスを作成する
ハルビン工程大学コンピューティングセンター李健萍李春艶張積東
サマリ
----本稿では、ODBCを使用してデータベースを操作するCdataBaseOperateクラスの構築について詳しく説明し、いくつかの主要な関数の具体的な実装と、実際のアプリケーションでの使用について説明します.
----VC++のMFCクラスライブラリはプログラミング者のためにデータベース操作のクラスを作成したことがよく知られています.プログラミング者はウィザードを使ってデータベースと連結してデータベースを操作するアプリケーションを構築することができます.コードを作成する必要はありません.これはプログラミング者に近道を提供したに違いありません.ただし、ウィザードを使用する場合は、単一または複数のドキュメントベースのアイテムを選択するだけでデータ・ソースを選択でき、指定したデータベースに接続され、ウィザードで生成されたダイアログ・ベースのアプリケーションではデータベースのサポートは提供されません.単一のドキュメントまたは複数のドキュメントに基づくアプリケーションであっても、例えば、テーブルを開き、一定の条件を満たすレコードセットを返す必要がある場合、MFCは、要求に完全に合致する既存の関数を提供しない.もし、MFCが提供するデータベース操作に加えて、自分で設計した関数、すなわち、データベース操作に対するクラスを設計し、プログラムにこのクラスを手作業で加えることができれば、ダイアログベースのアプリケーションでデータベース操作を実現することができ、また、自分のアプリケーションの具体的なニーズに対してクラスの関数を設計することもできる、特定の機能の実現に大きな便利さを提供した.
----データベース操作に関するアプリケーションでは、よく使用されるMFCクラスはCdaoDatabaseクラス、CdaoTableクラス、CdaoRecordsetクラス、CdaoQueryDefクラスであり、データベースを操作する場合は、まずデータベースを開き、データベース内のテーブルを開き、クエリーセットとレコードセットを得る必要があります.自分で定義したクラスでこの4つのクラスの操作を統合し、テーブルを開いてクエリーセットとレコードセットを得る関数を設計します.その後、アプリケーションでクラスを使用するときにクラスのヘッダファイルを含めるだけで、設計した関数を直接呼び出すことができます.
----データベース・クラスを構築するプロセスは、次の4つのステップに分けられます.
----一、ベースクラスのないCdataBaseOperateクラスを定義する
----1、WorkspaceウィンドウでClassViewタブを選択し、ツリー型クラス構造図の根元を右クリックし、New Classを選択する….
----2、Class typeでGeneric Classを選択する.
----3、Nameに作成する新しいクラスの名前を記入する.大文字Cで始まると、自動的に新しいクラスのヘッダファイルと実装ファイルが作成される.ファイルの名前はクラス名で最初の大文字Cを削除する.ファイルの名前を変更するには、changeボタンをクリックする.
----4、各項目を記入した後、OKボタンを押して確定して、1つのベースクラスのない新しいクラスは創立に成功して、しかし、彼はまだ1つの空のクラスで、次のステップ、クラスに内容を追加します.
----二、カスタムクラスに関連定義を加える
----1.本アプリケーションでは、ODBCを使用してSQL SERVERのデータベースに接続されているため、クラスの実装ファイル構築関数には、#define SQL_DATABASE _T("ODBC;DSN=sql-database;UID=sa;PWD=pass;") DSN=sql-databaseは、確立されたODBC結合の名前がsql-databaseであることを示し、他のデータベースを選択した場合は、必要なデータベースと確立された結合を変更するか、sql-databaseを再構成して新しいデータベースに結合させるだけです.UID=sa;PWD=passは、登録データベースのユーザ名がsa、パスワードがpass、パスワードが空の場合はPWD="と表示されます.
----2、このクラスではMFCクラスライブラリが提供するデータベースに関するいくつかのクラスCdaoDatabaseクラス、CdaoTableDefクラス、CdaoRecordsetクラス、CdaoQueryDefクラスを総合的に使用するが、これらの4つのクラスの定義と実現はヘッダファイルafxdaoに含まれる.hでは、そのため、新しく定義されたクラスのヘッダファイルに必ず文を追加します.
 #include < afxdao.h >;

----3、使用する4つのクラスに対して1つのオブジェクトを宣言します.
 	CDaoDatabase* loc_pDataBase; 	
    CDaoTableDef* loc_pTable;
	CDaoRecordset loc_pRecordset; 	
    CDaoQueryDef* loc_pQueryDef;

----CdaoDatabaseクラス、CdaoTableDefクラス、およびCdaoQueryDefクラスは、オブジェクトポインタを定義します.CdaoDatabaseクラスを例に、CdataBaseOperateクラスのコンストラクション関数でオブジェクトポインタloc_を初期化pDataBase=new CDaoDatabase;構造関数でポインタdelete loc_を解放するにはpDataBase;
----三、カスタムクラスに必要な関数と変数を加える
----手作業で関数を追加するには、2つの作業が含まれています.まず、ヘッダファイルに関数の宣言を追加します.それから、実装ファイルに関数の具体的な実装を追加します.宣言と実装は必ず統一しなければなりません.
----ウィザードを使用して、関数と変数を追加します.
----1、WorkspaceウィンドウでClassViewタブを選択する.
----2、ツリー型クラス構造図の関数と変数を追加するクラスを右クリックし、メンバー関数を追加する場合はAdd Member Functionをクリックし、虚関数を追加する場合はAdd Virtual Functionをクリックし、メンバー変数を追加する場合はAdd Member Variableをクリックする.
----3、ダイアログが出たら、メンバー関数または変数の名前、タイプを記入し、自動的に関数の宣言と実現を追加する.
----4、関数を追加する具体的な操作は、コードを編集することによってさらに記入することができる.
--WorkspaceウィンドウのClassViewオプションですぐに表示されます.また、ClassViewの対応する関数をクリックすると、その関数の実装部分に入り、コードをさらに記述できます.それができない場合は、メンバー関数を追加する操作が間違っていることを示します.
----以下、本アプリケーションを例に、具体的な表構造といくつかの主要関数の実現を示し、読者は自分の実際の状況に基づいて関数を設計することができる.
----このアプリケーションの一般的なテーブルの構造は次のとおりです.
                                  
                                   

----データベースを開く関数は次のようになります.
	if (!loc_pDataBase->IsOpen())
	loc_pDataBase->Open( NULL, FALSE, 
FALSE, SQL_DATABASE);

----CdaoDatabaseクラスの2つの関数IsOpen()とOpen(NULL,FALSE,FALSE,SQL_DATABASE)が使用されます.クラスのポインタオブジェクトloc_が宣言されているためです.pDataBaseなので、CdaoDatabaseクラスの関数を直接呼び出すことができます.ここで、Open()関数の最後のパラメータSQL_DATABASEは、前述したように、関連するデータベースを開く.
----プログラムで表を開くと、すべてのレコードセットを返すだけでなく、一定の条件を満たすレコードセットを返すために使用されるため、表を開く関数は表名のほかにパラメータ難易度係数があり、lNDXS=0の場合、表中のすべてのデータを選択し、lNDXS=1~nの場合、選択難易度係数=1~nのレコードを示す.
bool CDataBaseOperate::OpenTable
(CString strTableName,long lNDXS)
{
	CString strFieldNumber;
	loc_pTable=new CdaoTableDef
(loc_pDataBase); 
	if (!loc_pTable->IsOpen())
		loc_pTable->Open(strTableName); 
        //       
	strFieldNumber.Format("%d",loc_pTable- >
GetFieldCount());        //     
CString Sqlstr,Sqlstr1,Sqlstr2;
loc_pQueryDef=new CDaoQueryDef(loc_pDataBase); 
	       //         
	if (lNDXS==0)
        { 	
    Sqlstr=_T("SELECT * FROM "+strTableName);
        }
	else 
   { Sqlstr1="SELECT * FROM "+strTableName ;
	  Sqlstr2.Format("WHERE     = %d",lNDXS);
          Sqlstr=_T(Sqlstr1+Sqlstr2);	
         }
	loc_pQueryDef->Create(NULL,Sqlstr);
	loc_pRecordset.Open(loc_pQueryDef);
	m_nRecordNumber=0;
	while(!loc_pRecordset.IsEOF())	
        {   	
             m_nRecordNumber++;	
             loc_pRecordset.MoveNext( );	
         }
    return TRUE; 
}


----データベースのセキュリティを維持するために、テーブルは後で閉じ、テーブルを閉じると同時に、テーブルを開く操作時に初期化されたオブジェクトポインタを解放します.たとえば、delete loc_pQueryDef.同様に、コンストラクション関数で初期化されたオブジェクトポインタは、コンストラクション関数で必ず解放されることに注意してください.オブジェクトポインタの初期化と解放はペアで表示されます.
    loc_pDataBase=new CDaoDatabase; 
    //             。
    delete loc_pDataBase;             
    //             。

----
四、CdataBaseOperate類の応用
----1、VC++のウィザードを使用してアプリケーションを生成します.必要に応じて、ダイアログベースまたは単一、複数のドキュメントベースを選択できます.単一または複数のドキュメントを選択するときは、データベースサポートを選択しないでください.
----2、アプリケーションのメインヘッダファイルに#include“DataBaseOperate.h”を加え、CdataBaseOperateクラスのオブジェクトを宣言します.public:CDataBaseOperate m_CDataBaseOperate;
----3、CdataBaseOperateクラスを指すオブジェクトがあれば、CdataBaseOperateクラスで作成したばかりの関数を「m_CdataBaseOperate.関数名」で呼び出すことができます.
まとめ:
----本文はVC++6.0の下のCdataBaseOperate類の創立と応用の1つの初歩的な検討で、CdataBaseOperate類が実現した機能はとても強いです.紹介したCdataBaseOperateクラスのいくつかの基本的でよく使われる関数に加えて、CdataBaseOperateには他の面での機能関数がたくさんありますが、ここでは一つ一つ紹介しません.CdataBaseOperateクラスの関数は,データベースコンテンツの表示,修正,追加,削除などの機能を実現し,基本的にデータベースオペレータのニーズを満たしている.これらに加えて、プログラマはプログラムの必要に応じて独自の関数を定義することができます.
----本明細書で提供されるプログラムはすべてVC++6.0でコンパイルされている.