MFC+SQL Server:MFC+ADO操作データベースのデータ


ActiveX Data Objects
ユーザー・データベースのデータ構造と含まれるデータを表すプログラム・オブジェクト.MicrosoftVisual Basicエディタでは、ADOオブジェクトおよびADOの追加コンポーネント(MicrosoftADO Extensions for DLL and Security(ADOX)と呼ばれる)を使用して、テーブルおよびクエリーの作成または変更、データベースの検証、または外部データ・ソースへのアクセスを行うことができます.また、ADOを使用して、コード内でデータベース内のデータを操作することもできます.
プログラミングモデル
データ・ソースを接続し、トランザクションの開始を選択します.SQLコマンドを表すオブジェクト(Command)の作成を選択できます.変数パラメータ(Parameter)として、指定したカラム、テーブル、およびSQLコマンドの値を選択できます.コマンド(Command、Connection、Recordset)を実行します.コマンドがローで返された場合、ローはストレージオブジェクトに格納されます(Recordset).データの並べ替え、フィルタリング、位置決めを行うために、格納されたオブジェクトのビューを作成することができます.データを編集します.行、列を追加、削除または変更できます.適切な場合には、ストレージオブジェクトの変更を使用してデータソースを更新することができます.トランザクションを使用した後、トランザクションで行った変更を受け入れるか拒否できます.トランザクションを終了します.
使用方法
ADOがインストールされると、VBのプロジェクト->リファレンスダイアログボックスで次の図のようなものが表示されます.「ActiveX Data Objects 1.5 Library」(ADODB)を選択します.下の「ADO Recordset 1.5 Library」は、集約されたデータ・アクセス・オブジェクトを定義するクライアントのバージョン(ADOR)です.ADORは、リモート・データ・ソースとの連絡を確立するためにConnectionオブジェクトを必要としないため、クライアントのデータ・アクセスに十分です.より多くの外部データ・ソースにアクセスするには、新しいデータベース・システムに新しいODBCドライバをインストールする必要があるように、独自のOLE DB Providerをインストールする必要があります.外部データソースに独自のOLE DB Providerがない場合は、OLE DB SDKを使用して、この外部データソースのOLE DB Providerを作成する必要があります.これはもう本論文で議論する範囲ではない.

次のサンプルコードは、Northwindsデータベースをリモート・データ・ソースとして使用し、ADOでアクセスします.まずコントロールパネルで「32ビットデータソース」を開き、「追加」ボタンをクリックします.ポップアップ・ダイアログ・ボックスで、「Microsoft Access Driver(*.mdb)」をデータ・ソース・ドライバとして選択します.次に、下の図に示すように、ダイアログボックスに次の内容を入力して、データベースNorthwindsが存在するパスを選択します.「完了」をクリックして、ODBCデバイスマネージャを終了します.新しいVBプロジェクトを開始し、フォームのLoadイベントに次のコードを入力します:Private Sub Form_Load() Dim cn As ADODB.Connection Set cn = New ADODB.Connection 'Set Connection properties cn.ConnectionString = “DSN=RDC Nwind;UID=;PWD=;” cn.ConnectionTimeout = 30 cn.Open If cn.State = adStateOpen Then _ MsgBox “Connection to NorthWind Successful!” cn.Close End SubはF 5を押してプログラムを実行し、メッセージボックスが飛び出して接続に成功したことを示します.注意してください.ここではADODBと特に明記しています.ADORではなくConnectionConnectionは、両者を区別するために行われます(ADODBとADORを引用する場合は、このようにする必要があります).接続文字列はRDOの接続文字列とあまり差がないように見えます.実際、両者は確かに差が少ない.SQLサーバデータベースにアクセスする場合は、「接続プロパティcnを設定する」のように接続コードが表示されます.Provider = “MSDASQL” cn.ConnectionString = “driver={SQL Server};” & “server=prod1;uid=bg;pwd=;database=main” cn.Open"Provider"属性はSQL ServerのOLE DB Providerを指す.サンプル・プログラムに戻り、Recordsetオブジェクトを作成して「Orders」テーブルにアクセスし、テーブルの「ShipCountry」フィールドから最初の10の重複しない国名を生成します.フォームLoadイベントのコードを次のように表示するように変更します.Private Sub Form_Load() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sSQL As String Dim sOut As String Dim Count As Integer Set cn = New ADODB.Connection Set rs = New ADODB.Recordset ’ Set properties of the Connection. cn.ConnectionString = “DSN=RDC Nwind;UID=;PWD=;” cn.ConnectionTimeout = 30 cn.Open If cn.State = adStateOpen Then _ MsgBox “Connection to NorthWind Successful!” sSQL = “SELECT DISTINCT Orders.ShipCountry FROM Orders” Set rs = cn.Execute(sSQL) 'Enumerate the recordset sOut = “” For Count = 1 To 10 sOut = sOut & rs(“ShipCountry”) & vbCrLf rs.MoveNext Next Count MsgBox sOut, vbExclamation, “ADO Results” cn.Close End Subがプログラムを実行すると、下図のようなメッセージボックスが表示されます.残念なことに、次のコードに示すように、独自のConnectionプロパティを持つ独立したRecordsetオブジェクトを作成する必要があります.Private Sub Form_Load() Dim rs As ADODB.Recordset Dim sSQL As String Dim sOut As String Dim Count As Integer Set rs = New ADODB.Recordset sSQL = “SELECT DISTINCT Orders.ShipCountry FROM Orders” rs.Open sSQL, “DSN=RDC Nwind;UID=;PWD=;”, OpenDynamic'Report Recordset Connection information MsgBox.ActiveConnection,"Connection Info"'Enumerate the recordset sOut=""For Count=1 To 10 sOut=sOut&rs("ShipCountry")&vbCrLf rs.MoveNext Count MsgBox,vbExclamation,"ADO Results"rs.Close End Sub上のコードが返す結果と同じ結果を返した結果と同じ結果を返します前例と同じように、ただし、このコードのRecordsetは独立しています.この点はDAOとRDOではできません.RecordsetオブジェクトのOpenメソッドは、SQLクエリから返されたレコードを表すカーソルを開きます.Connectionオブジェクトを使用してリモート・データ・ソースと接続できますが、この場合、ConnectionオブジェクトとRecordsetオブジェクトは平行な関係にあることを覚えておいてください.本稿では、ADOの強力な機能の氷山の一角だけを紹介します.マイクロソフトは、将来的にADOがDAOとRDOに取って代わると約束した.だから今、あなたのデータアクセスコードをADOの懐に投げ込むことを考えるべきです.ADOの文法は既存の文法とあまり差がないからです.マイクロソフトやサードパーティは、将来、この変換プロセスを簡素化するために変換ウィザードを開発するかもしれません.これからは、純粋なADOコードのプログラムを開発します.DAOやRDOコードを使ってプログラムを開発し続けることもできますが、時代遅れの感じはいつもよくありません.
MFC-ADO類応用設計
ヘッダファイル
#pragma once

#import "C:\Program Files\Common Files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

class CADOConnect
{
public:
	CADOConnect();
	virtual~CADOConnect();

	_ConnectionPtr m_pConnection;		//               
	_RecordsetPtr m_pRecordPtr;			//     (   )

	//         ,    ,  SQL  ,    
	//         ,    ,  SQL  ,    
	void OnInitDBConnect();
	_RecordsetPtr &GetRecordSet(_bstr_t bstrSQL);
	BOOL ExecuteSQL(_bstr_t bstrSQL);
	void ExitConnect();

};



ソースファイル
#include "stdafx.h"
#include "ADOConnect.h"


CADOConnect::CADOConnect()
{
}


CADOConnect::~CADOConnect()
{
}


void CADOConnect::OnInitDBConnect()
{
	//   connection  
	m_pConnection.CreateInstance("ADODB.Connection");
	//      
	_bstr_t strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Student;Data Source=.";// Catalog     ,Data    .       

	//                           
	m_pConnection->Open(strConnect, "", "", adModeUnknown);
}

_RecordsetPtr & CADOConnect::GetRecordSet(_bstr_t bstrSQL)
{
	try
	{
		if (m_pConnection == NULL)		//        
			OnInitDBConnect();
		m_pRecordPtr.CreateInstance(__uuidof(Recordset));		//        
		//     ,     
		m_pRecordPtr->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
	}
	catch (_com_error e)	//     
	{
		AfxMessageBox(e.Description());
	}

	return m_pRecordPtr;		//      
}


BOOL CADOConnect::ExecuteSQL(_bstr_t bstrSQL)
{
	try
	{
		if (m_pConnection == NULL)
		{
			OnInitDBConnect();
		}
		m_pConnection->Execute(bstrSQL, NULL, adCmdText);

		return true;
	}
	catch (_com_error e)
	{
		AfxMessageBox(e.Description());
		return false;
	}
}

void CADOConnect::ExitConnect()
{
	if (m_pConnection != NULL)
	{
		m_pRecordPtr->Close();	//     
		m_pConnection->Close();	//     
	}

	//     
	::CoUninitialize();
}