Visual CでのODBCプログラミング例++

      マイクロソフトの開発者Studioは、最も標準的なデータベース形式の32ビットのODBCドライバを提供しています。SQL Serverの、アクセス、パラドックス、dBaseの、FoxProの、エクセル、Oracle、およびMicrosoftテキスト:を含むこれらの標準データ形式。ユーザーが他のデータ形式を使用したい場合は、必要がODBCドライバとDBMSをインストールします。   

      新しいデータベース・スキーマを生成するために、独自のDBMSのデータベース管理機能を使用するユーザーが完了したら、ODBCを使用してデータソースをログに記録することができます。ユーザのアプリケーションのために、限りドライバがインストールされているとして、あなたは多くの異なるデータベースを登録することができます。詳細についてはODBCに関するログデータベースのオンライン・ヘルプを参照してください。   

      Aは、MFCが提供するODBCデータベースクラス   
      のVisual C ++ MFCベースクラスライブラリのは、いくつかのデータベースクラスを定義します。ODBCを使用している場合が多いのCDatabase(データベースタイプ)、のCRecordset(レコードセットクラス)とCRecordView(視覚的なレコードセットクラス)に使用してプログラミング。   
      たCDatabaseクラスオブジェクトデータソースへの接続を提供し、データ・ソースは、それによって動作させることができます。   
      クラスCRecordsetのオブジェクトは、データ・ソースから抽出されたレコードセットを提供します。動的な行のセット(ダイナセット)とスナップショットセット(スナップショット):CRecordsetのオブジェクトは、典型的には2つの形態で使用されています。行うことができ、他のユーザーとのペースを保つために、ダイナミックラインセットを変更し、その後、スナップショットは、データの静的な図である設定。記録ダイナミックスクロールの行に設定した場合、各フォームセットは点を除いて、提供されるレコードのセットを記録する時に開放され、記録は、他のユーザまたはアプリケーションの記録の他のセットによって作ら変更に応じて表示されます。   
      CRecordViewクラス・オブジェクト・データベース・レコードは、このビューを直接CRecordsetのオブジェクトテーブルビューに接続され、コントロールの形で表示することができます。   

      第二に、アプリケーションのODBCプログラミング
      
自動的にODBCアプリケーションフレームワークを生成することができますのVisual C ++ AppWizardを適用、手順は次のとおりです。オープンは、[ファイル]メニューの[新規作成]オプションは、その後もAppWizardのプロンプトに従い、MFC AppWizardで(exeファイル)を選択したプロジェクト、プロジェクト名で塗りつぶし、選択します操作。   
      AppWizardのかどうかを尋ねられたときあなたは、ファイルをサポートして選択し、データベースビューをデータベースを読み書きしたい場合は、データベースのサポートが含まれ、あなたがアクセス情報にしたい場合は、データベース内のライトバックなしではなされ、その後、ファイルのサポートなしでデータベースビューを選択し変更します。データベースのサポートを選択した後、データベースのソースボタンが活性化され、データオプション]ダイアログボックスを呼び出すためにそれを選択します。;選択したすべてのデータベーステーブルが含まれているリスト、[OK]をクリックした後Super_ES、選択データベーステーブル]ダイアログボックスが表示されます:ODBCデータベースリソースのような、動作するデータベースを選択し、[データベースのオプション]ダイアログボックスに登録されているが表示されます動作し、[OK]をクリックし、テーブルを選択した後。データベースとデータテーブルを選択したら、AppWizardでは、いつものように動作を続けることができます。   
      、オブジェクトはCSuper_ESSet m_pSetを指すポインタを含む、ポインタがAppWizardで、セット及び記録ビジュアル形式との間のリンクを確立する目的により設定され、その結果:生成されたアプリケーション・フレームワーク(CSuper_ESViewなど)ビューで:特に注目すべきことですクエリ結果の集中管理記録を簡単に視覚的なフォーム上に表示することができます。   
      データソースプログラムとの接続を確立するには、CDateBaseを必要と:: OpenEx()またはのCDatabase :: open()関数は、初期化することです。それは、レコードセットオブジェクトを使用して構築される前に、データベースのオブジェクトを初期化する必要があります。

      第三に、例
  1検索レコード
  クエリのレコードがCRecordsetの::オープン()とCRecordsetの::のRequery()メンバ関数を使用します。オブジェクトクラスのCRecordsetを使用する前に、レコードの有効なセットを取得するのCRecordset :: open()関数を使用する必要があります。あなたがのCRecordset :: open()関数を使用していたら、再びのCRecordset ::のRequery()関数をクエリを使用することができます。
  そうでない場合は、m_pDatabaseはNULLポインタである場合には、たCDatabaseを作成するために、1がすでにある場合は、オープンのCDatabaseオブジェクトポインタは、その後、ODBC接続を確立するデータベースオブジェクトを使用して、CRecordsetのクラスオブジェクトm_pDatabaseメンバ変数に渡されたとき、:: open()関数のCRecordsetを呼び出すにはクラスオブジェクトは、それがデフォルトのデータソースに接続され、その後、クラスのCRecordsetオブジェクトを初期化しています。デフォルト・データ・ソースはGetDefaultConnect()関数が得られています。また、例えば、のCRecordset :: open()関数を呼び出すために必要なSQL文を提供し、それにすることができます:Super_ESSet.Open(AFX_DATABASE_USE_DEFAULT、ます。strSQL);
  パラメータを指定しない場合、プログラムはデフォルトのSQLステートメントを使用して、その中にGetDefaultSQL()関数が動作するSQL文で指定されました:

  CStringのCSuper_ESSet :: GetDefaultSQL()
  {戻り_T( "[BsicData]、[MinSizeプロパティ]");}

  GetDefaultSQL()関数の場合、すなわち、SELECT文のデフォルトの動作に対応し、テーブルの名前を返します。

  BasicData、MainSize SELECT * FROM

  問い合わせ処理では、あなたはまた、クエリを実行し、結果をソートするメンバ変数m_strFilterとm_strSort CRecordsetの条件を使用することができます。SQL文の文字列の後、フィルタ文字列の保管条件にm_strFilter、ソート文字列にm_strSort、SQL文のORDER BYに格納されている文字列。以下のような:

  Super_ESSet.m_strFilter = "タイプ="电动机」「。 
  Super_ESSet.m_strSort = "電圧";
  Super_ESSet.Requery();

  SQL文を対応する次のとおりです。

  BasicData、MainSize SELECT * FROM
  TYPE = '电动机'
  ORDER BY VOLTAGE

  m_strFilterへの直接の割り当てに加えて、あなたはまた、パラメータを使用できます。パラメータ化クエリタスクの条件を完了するために、より直感的かつ簡単に使用することができます。パラメータを使用するステップは、以下:
  Sパラメトリック文を:

  CStringのP1;
  フロートP2;

  コンストラクタでSは可変のパラメータを初期化します。

  P1 = _T( "")。
  P2 =は0.0f;
  m_nParams = 2。

  結合対応するパラメトリックSカラム:

  pFX-> SetFieldType(CFieldExchange :: PARAM)
  のRFX_Text(PFX、_T(「P1」)、P1)。
  RFX_Single(PFX、_T(「P2」)、P2)。

  :上記の手順の完了は、パラメトリッククエリ条件を用いて行うことができる後

  m_pSet-> m_strFilter = "TYPE =?AND VOLTAGE =? "; m_pSet-> P1 ="电动机"。
  m_pSet-> P2 = 60.0;
  m_pSet->のRequery();

  変数パラメータの値は、クエリ文字列を置換するには、「?」のワイルドカードを結合ために。
  クエリの結果は、複数のレコードである場合、移動のCRecordsetクラス()、MoveNextメソッド()、MovePrev機能することができる ()にMoveFirst() カーソルを移動するとのMoveLastを()。
  2.レコードの追加
  のAddNew()関数を使用して記録増加を、要件が増加オープンできるデータベース基づくものでなければなりません。

  m_pSet->のAddNew(); //テーブルの末尾に新しいレコードを追加します
  。m_pSet-> SetFieldNullの(&(m_pSet-> m_type)、FALSE)
  m_pSet-> m_type = "モーター";
  ......
  //新しいフィールドの値を入力してください
  m_pSet->更新();
  データベースに//新しいレコード
  m_pSet->のRequery();
  //レコードのセットを再構築

  3.削除レコードは
  関数の後に更新()関数を呼び出す必要はありません()削除レコードを直接削除()関数を使用して、[削除]を呼び出すことができます。

  削除m_pSet->();
  (!m_pSet-> IsEOF())の場合
  m_pSet-> MoveNextメソッド();
  他
  m_pSet->のMoveLast();

  4.変更を記録
  レビューは、編集()関数を使用して記録します:

  m_pSet->編集();
  //現在のレコードを変更
  m_pSet-> m_type =「発電機」;
  //現在のレコードのフィールド値を変更
   ......
   m_pSet->アップデート(); //データベースに結果を変更します
  m_pSet->のRequery ();

  アンドゥ操作がされた
  ユーザ選択レコードを追加または変更する場合、現在の操作を中止することが望ましい更新()関数の前に呼び出されてもよい。
  CRecordsetの::移動(AFX_MOVE_REFRESH)変更または増大モードを元に戻すと、追加する前にパターンを復元または変更します現在のレコード。前記パラメータの値がゼロAFX_MOVE_REFRESHです。
  6.データベースの多重接続の
  メンバ変数のm_pDatabaseクラスのCRecordsetで定義されています:

  たCDatabase * m_pDatabase。

  これは、クラスのオブジェクトデータベースへのポインタです。オブジェクトクラスのCRecordsetは、クラスオブジェクトのポインタに開かれている、前にコールopen()関数はm_pDatabaseたCDatabaseに合格した場合は、同じたCDatabaseクラスのオブジェクトを共有することができます。以下のような:

  CDatabase m_db;
  CRecordSet m_set1,m_set2;
  m_db.Open(_T(″Super_ES″)); //建立ODBC连接
  m_set1.m_pDatabase=&m_db;
  //m_set1复用m_db对象
  m_set2.m_pDatabse=&m_db;
  // m_set2复用m_db对象

  7.SQL语句的直接执行
  虽然我们可以通过CRecordSet类完成大多数的查询操作,而且在CRecordSet::Open()函数中也可以提供SQL语句,但是有时候我们还是希望进行一些其他操作,例如建立新表、删除表、建立新的字段等,这时就需要使用CDatabase类直接执行SQL语句的机制。通过调用CDatabase::ExecuteSQL()函数来完成SQL语句的直接执行:

  BOOL CDB::ExecuteSQLAndReportFailure(const CString& strSQL)
  {TRY
  {m_pdb->ExecuteSQL(strSQL);
  //直接执行SQL语句}
  CATCH (CDBException,e)
  {CString strMsg;
  strMsg.LoadString(IDS_EXECUTE_SQL_FAILED);
  strMsg+=strSQL;
  return FALSE;}
   END_CATCH
  return TRUE;}

  应当指出的是,由于不同的DBMS提供的数据操作语句不尽相同,直接执行SQL语句可能会破坏软件的DBMS无关性,因此在应用中应当慎用此类操作。
  8.动态连接表
  表的动态连接可以利用在调用CRecordSet::Open()函数时指定SQL语句来实现。同一个记录集对象只能访问具有相同结构的表,否则查询结果将无法与变量相对应。

void CDB::ChangeTable()
{  
if (m_pSet->IsOpen()) m_pSet->Close();
 switch (m_id)
 {
  case 0: 
   m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,″SELECT * FROM SLOT0″);
   //连接表SLOT0
   m_id=1; 
   break;
  case 1: 
   m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,″SELECT * FROM SLOT1″); //连接表SLOT1
   m_id=0;
   break;
 }
}

  9.动态连接数据库
  可以通过赋与CRecordSet类对象参数m_pDatabase来连接不同数据库的CDatabase对象指针,从而实现动态连接数据库。

void CDB::ChangeConnect()
{
 CDatabase* pdb=m_pSet->m_pDatabase;
 pdb->Close();
 switch (m_id)
 {   
case 0:
   if (!pdb->Open(_T(″Super_ES″)))
    //连接数据源Super_ES
   {
    AfxMessageBox(″数据源Super_ES打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);
    exit(0);
   }
   m_id=1;
   break; 
    case 1:
   if (!pdb->Open(_T(″Motor″)))
   //连接数据源Motor
   {
    AfxMessageBox(″数据源Motor打开失败″,″请检查相应的ODBC连接″, MB_OK|MB_ICONWARNING);
    exit(0);
   }
   m_id=0; 
   break;
 }
}

  总结:
  Visual C++中的ODBC类库可以帮助程序员完成绝大多数的数据库操作。利用ODBC技术使得程序员从具体的DBMS中解脱出来,从而可以减少软件开发的工作量,缩短开发周期,并提高效率和软件的可靠性。

发布了1 篇原创文章 · 获赞 0 · 访问量 2715

おすすめ

転載: blog.csdn.net/yjj350418592/article/details/105127058