Mfc-database-classes

提供:Dev Guides
移動先:案内検索

MFC-データベースクラス

  • データベース*は、簡単にアクセス、管理、および更新できるように編成された情報のコレクションです。 ODBCに基づくMFCデータベースクラスは、ODBCドライバーが利用可能なデータベースへのアクセスを提供するように設計されています。 クラスはODBCを使用するため、アプリケーションは多くの異なるデータ形式および異なるローカル/リモート構成のデータにアクセスできます。

異なるデータベース管理システム(DBMS)を処理するために特別なケースのコードを記述する必要はありません。 ユーザーがアクセスしたいデータに適したODBCドライバーを持っている限り、ユーザーはプログラムを使用してそこに保存されているテーブルのデータを操作できます。 データソースは、データベース管理システム(DBMS)によってホストされるデータの特定のインスタンスです。 例には、Microsoft SQL Server、Microsoft Accessなどが含まれます。

CDatabase

MFCは、データソースへの接続を表すクラス CDatabase を提供します。これを使用して、データソースを操作できます。 アプリケーションで一度に1つ以上のCDatabaseオブジェクトをアクティブにすることができます。

____CDatabaseクラスのメソッドのリストです。

Sr.No. Name & Description
1

BeginTrans

接続されたデータソースで、クラス CRecordset のAddNew、Edit、Delete、およびUpdateメンバー関数の一連の可逆呼び出しである「トランザクション」を開始します。 データソースは、 BeginTrans が効果を発揮するためのトランザクションをサポートする必要があります。

2

BindParameters

  • ExecuteSQL* を呼び出す前にパラメーターをバインドできます。
3

Cancel

非同期操作または2番目のスレッドからのプロセスをキャンセルします。

4

CanTransact

データソースがトランザクションをサポートする場合、ゼロ以外を返します。

5

CanUpdate

  • CDatabase* オブジェクトが更新可能な場合(読み取り専用ではない場合)、ゼロ以外を返します。
6

Close

データソース接続を閉じます。

7

CommitTrans

BeginTransによって開始されたトランザクションを完了します。 データソースを変更するトランザクション内のコマンドが実行されます。

8

ExecuteSQL

SQLステートメントを実行します。 データレコードは返されません。

9

GetBookmarkPersistence

レコードセットオブジェクトでブックマークが保持される操作を識別します。

10

GetConnect

CDatabaseオブジェクトをデータソースに接続するために使用されるODBC接続文字列を返します。

11

GetCursorCommitBehavior

開いているレコードセットオブジェクトでトランザクションをコミットする効果を識別します。

12

GetCursorRollbackBehavior

開いているレコードセットオブジェクトでトランザクションをロールバックする効果を識別します。

13

GetDatabaseName

現在使用中のデータベースの名前を返します。

14

IsOpen

  • CDatabase* オブジェクトが現在データソースに接続されている場合、ゼロ以外を返します。
15

OnSetOptions

フレームワークによって呼び出され、標準の接続オプションを設定します。 デフォルトの実装では、クエリのタイムアウト値が設定されます。 SetQueryTimeout を呼び出すことにより、これらのオプションを事前に確立できます。

16

Open

(ODBCドライバーを介して)データソースへの接続を確立します。

17

OpenEx

(ODBCドライバーを介して)データソースへの接続を確立します。

18

Rollback

現在のトランザクション中に行われた変更を取り消します。 データソースは、BeginTrans呼び出しで定義された変更されていない前の状態に戻ります。

19

SetLoginTimeout

データソース接続の試行がタイムアウトになるまでの秒数を設定します。

20

SetQueryTimeout

データベースクエリ操作がタイムアウトするまでの秒数を設定します。 後続のすべてのレコードセットのOpen、AddNew、Edit、およびDelete呼び出しに影響します。

新しいMFCダイアログベースのアプリケーションを作成して、簡単な例を見てみましょう。

  • ステップ1 *-TODO行のキャプションを*データベースからデータを取得*に変更し、次のスナップショットに示すように1つのボタンと1つのリストコントロールをドラッグします。

DBからデータを取得

  • ステップ2 *-ボタンのクリックイベントハンドラーとリストコントロールの変数m_ListControlを追加します。
  • ステップ3 *-次のスナップショットに示すように、いくつかのレコードを持つ1つのEmployeesテーブルを含む単純なデータベースがあります。

従業員表

  • ステップ4 *-CDatabaseクラスを使用できるように、次のヘッダーファイルを含める必要があります。
#include "odbcinst.h"
#include "afxdb.h"

クエリを挿入

SQL INSERT INTOステートメントは、データベースのテーブルに新しいデータ行を追加するために使用されます。

  • ステップ1 *-新しいレコードを追加するには、次のコードに示すように、CDatabaseクラスのExecuteSQL()関数を使用します。
CDatabase database;
CString SqlString;
CString strID, strName, strAge;
CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
CString sDsn;
CString sFile = L"D:\\Test.mdb";
//You must change above path if it's different
int iRec = 0;

//Build ODBC connection string
sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
TRY {
  //Open the database
   database.Open(NULL,false,false,sDsn);

   SqlString = "INSERT INTO Employees (ID,Name,age) VALUES (5,'Sanjay',69)";
   database.ExecuteSQL(SqlString);
  //Close the database
   database.Close();
}CATCH(CDBException, e) {
  //If a database exception occured, show error msg
   AfxMessageBox(L"Database error: " + e→m_strError);
}
END_CATCH;
  • ステップ2 *-上記のコードをコンパイルして実行すると、データベースに新しいレコードが追加されていることがわかります。

キューを挿入

レコードを取得

MFCアプリケーションで上記のテーブルを取得するには、次の手順に示すように、ボタンイベントハンドラーでデータベース関連の操作を実装します。

  • ステップ1 *-CDatabaseを使用するには、CDatabaseオブジェクトを作成し、そのOpen()関数を呼び出します。 これにより、接続が開きます。
  • ステップ2 *-接続されたデータソースで操作するためのCRecordsetオブジェクトを構築し、レコードセットコンストラクターにCDatabaseオブジェクトへのポインターを渡します。
  • ステップ3 *-接続の使用後、Close関数を呼び出してCDatabaseオブジェクトを破棄します。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
  //TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sFile = L"D:\\Test.mdb";
  //You must change above path if it's different
   int iRec = 0;

  //Build ODBC connection string
   sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
   TRY {
     //Open the database
      database.Open(NULL,false,false,sDsn);

     //Allocate the recordset
      CRecordset recset( &database );

     //Build the SQL statement
      SqlString = "SELECT ID, Name, Age " "FROM Employees";

     //Execute the query

      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);
     //Reset List control if there is any data
      ResetListControl();
     //populate Grids
      ListView_SetExtendedListViewStyle(m_ListControl,LVS_EX_GRIDLINES);

     //Column width and heading
      m_ListControl.InsertColumn(0,"Emp ID",LVCFMT_LEFT,-1,0);
      m_ListControl.InsertColumn(1,"Name",LVCFMT_LEFT,-1,1);
      m_ListControl.InsertColumn(2, "Age", LVCFMT_LEFT, -1, 1);
      m_ListControl.SetColumnWidth(0, 120);
      m_ListControl.SetColumnWidth(1, 200);
      m_ListControl.SetColumnWidth(2, 200);

     //Loop through each record
      while( !recset.IsEOF() ) {
        //Copy each column into a variable
         recset.GetFieldValue("ID",strID);
         recset.GetFieldValue("Name",strName);
         recset.GetFieldValue("Age", strAge);

        //Insert values into the list control
         iRec = m_ListControl.InsertItem(0,strID,0);
         m_ListControl.SetItemText(0,1,strName);
         m_ListControl.SetItemText(0, 2, strAge);

        //goto next record
         recset.MoveNext();
      }
     //Close the database
      database.Close();
   }CATCH(CDBException, e) {
     //If a database exception occured, show error msg
      AfxMessageBox("Database error: "+e→m_strError);
   }
   END_CATCH;
}

//Reset List control
void CMFCDatabaseDemoDlg::ResetListControl() {
   m_ListControl.DeleteAllItems();
   int iNbrOfColumns;
   CHeaderCtrl* pHeader = (CHeaderCtrl*)m_ListControl.GetDlgItem(0);
   if (pHeader) {
      iNbrOfColumns = pHeader→GetItemCount();
   }
   for (int i = iNbrOfColumns; i >= 0; i--) {
      m_ListControl.DeleteColumn(i);
   }
}
  • ステップ4 *-これがヘッダーファイルです。
//MFCDatabaseDemoDlg.h : header file
//

#pragma once
#include "afxcmn.h"


//CMFCDatabaseDemoDlg dialog
class CMFCDatabaseDemoDlg : public CDialogEx {
  //Construction
   public:
      CMFCDatabaseDemoDlg(CWnd* pParent = NULL);   //standard constructor

  //Dialog Data
   #ifdef AFX_DESIGN_TIME
      enum { IDD = IDD_MFCDATABASEDEMO_DIALOG };
   #endif

   protected:
      virtual void DoDataExchange(CDataExchange* pDX);   //DDX/DDV support
      void ResetListControl();

  //Implementation
   protected:
      HICON m_hIcon;

     //Generated message map functions
      virtual BOOL OnInitDialog();
      afx_msg void OnPaint();
      afx_msg HCURSOR OnQueryDragIcon();
      DECLARE_MESSAGE_MAP()
   public:
      CListCtrl m_ListControl;
      afx_msg void OnBnClickedButtonRead();
};
  • ステップ5 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

レコードの取得

  • ステップ6 *-読み取りボタンを押して、データベース操作を実行します。 Employeesテーブルを取得します。

レコードの取得

レコードを更新

SQL UPDATEクエリは、テーブル内の既存のレコードを変更するために使用されます。 UPDATEクエリでWHERE句を使用して、選択した行を更新できます。更新しないと、すべての行が影響を受けます。

  • ステップ1 *-IDが5であるAgeを更新して、簡単な例を見てみましょう。
SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";
database.ExecuteSQL(SqlString);
  • ステップ2 *-ボタンクリックイベントの完全なコードです。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
  //TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sDsn;
   CString sFile =
      L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";
  //You must change above path if it's different
   int iRec = 0;

  //Build ODBC connection string
   sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
   TRY {
     //Open the database
      database.Open(NULL,false,false,sDsn);

     //Allocate the recordset
      CRecordset recset(&database);

      SqlString = L"UPDATE Employees SET Age = 59 WHERE ID = 5;";

      database.ExecuteSQL(SqlString);

      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Build the SQL statement
      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Execute the query
      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);

     //Reset List control if there is any data
      ResetListControl();
     //populate Grids
      ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);

     //Column width and heading
      m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
      m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
      m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
      m_listCtrl.SetColumnWidth(0, 120);
      m_listCtrl.SetColumnWidth(1, 200);
      m_listCtrl.SetColumnWidth(2, 200);

     //Loop through each record
      while (!recset.IsEOF()) {
        //Copy each column into a variable
         recset.GetFieldValue(L"ID",strID);
         recset.GetFieldValue(L"Name",strName);
         recset.GetFieldValue(L"Age", strAge);

        //Insert values into the list control
         iRec = m_listCtrl.InsertItem(0,strID,0);
         m_listCtrl.SetItemText(0,1,strName);
         m_listCtrl.SetItemText(0, 2, strAge);

        //goto next record
         recset.MoveNext();
      }

     //Close the database
      database.Close();
   }CATCH(CDBException, e) {
     //If a database exception occured, show error msg
      AfxMessageBox(L"Database error: " + e→m_strError);
   }
   END_CATCH;
}
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

レコードの取得

  • ステップ4 *-読み取りボタンを押して、データベース操作を実行します。 次のEmployeesテーブルを取得します。

レコードの更新

  • ステップ5 *-年齢が69から59に更新されていることがわかります。

レコードを削除

SQL DELETEクエリは、テーブルから既存のレコードを削除するために使用されます。 DELETEクエリでWHERE句を使用して、選択した行を削除できます。そうしないと、すべてのレコードが削除されます。

  • ステップ1 *-IDが3であるレコードを削除して、簡単な例を見てみましょう。
SqlString = L"DELETE FROM Employees WHERE ID = 3;";

database.ExecuteSQL(SqlString);
  • ステップ2 *-ボタンクリックイベントの完全なコードです。
void CMFCDatabaseDemoDlg::OnBnClickedButtonRead() {
  //TODO: Add your control notification handler code here
   CDatabase database;
   CString SqlString;
   CString strID, strName, strAge;
   CString sDriver = L"MICROSOFT ACCESS DRIVER (*.mdb)";
   CString sDsn;
   CString sFile =
       L"C:\\Users\\Muhammad.Waqas\\Downloads\\Compressed\\ReadDB_demo\\Test.mdb";

  //You must change above path if it's different
   int iRec = 0;

  //Build ODBC connection string
   sDsn.Format(L"ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
   TRY {
     //Open the database
      database.Open(NULL,false,false,sDsn);

     //Allocate the recordset
      CRecordset recset(&database);

      SqlString = L"DELETE FROM Employees WHERE ID = 3;";

      database.ExecuteSQL(SqlString);

      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Build the SQL statement
      SqlString = "SELECT ID, Name, Age FROM Employees";

     //Execute the query
      recset.Open(CRecordset::forwardOnly,SqlString,CRecordset::readOnly);

     //Reset List control if there is any data
      ResetListControl();
     //populate Grids
      ListView_SetExtendedListViewStyle(m_listCtrl,LVS_EX_GRIDLINES);
     //Column width and heading
      m_listCtrl.InsertColumn(0,L"Emp ID",LVCFMT_LEFT,-1,0);
      m_listCtrl.InsertColumn(1,L"Name",LVCFMT_LEFT,-1,1);
      m_listCtrl.InsertColumn(2, L"Age", LVCFMT_LEFT, -1, 1);
      m_listCtrl.SetColumnWidth(0, 120);
      m_listCtrl.SetColumnWidth(1, 200);
      m_listCtrl.SetColumnWidth(2, 200);

     //Loop through each record
      while (!recset.IsEOF()) {
        //Copy each column into a variable
         recset.GetFieldValue(L"ID",strID);
         recset.GetFieldValue(L"Name",strName);
         recset.GetFieldValue(L"Age", strAge);

        //Insert values into the list control
         iRec = m_listCtrl.InsertItem(0,strID,0);
         m_listCtrl.SetItemText(0,1,strName);
         m_listCtrl.SetItemText(0, 2, strAge);

        //goto next record
         recset.MoveNext();
      }
     //Close the database
      database.Close();
   }CATCH(CDBException, e) {
     //If a database exception occured, show error msg
      AfxMessageBox(L"Database error: " + e→m_strError);
   }
   END_CATCH;
}
  • ステップ3 *-上記のコードをコンパイルして実行すると、次の出力が表示されます。

レコードの取得

  • ステップ4 *-読み取りボタンを押して、データベース操作を実行します。 Employeesテーブルを取得します。

レコードの更新