MFC+SQL Server——MFC+ADO操作數據庫中的數據

ActiveX Data Objects

一種程序對象,用於表示用戶數據庫中的數據結構和所包含的數據。在Microsoft Visual Basic編輯器中,可以使用ADO對象以及ADO的附加組件(稱爲Microsoft ADO Extensions for DLL and Security(ADOX))來創建或修改表和查詢、檢驗數據庫、或者訪問外部數據源。還可在代碼中使用ADO來操作數據庫中的數據。

編程模型

連接數據源 (Connection),可選擇開始事務。
可選擇創建表示 SQL 命令的對象 (Command)。
可選擇指定列、表以及 SQL 命令中的值作爲變量參數 (Parameter)。
執行命令(Command、Connection 或 Recordset)。
如果命令以行返回,將行存儲在存儲對象中 (Recordset)。
可選擇創建存儲對象的視圖以便進行排序、篩選和定位數據 (Recordset)。
編輯數據。可以添加、刪除或更改行、列 (Recordset)。
在適當情況下,可以使用存儲對象中的變更對數據源進行更新 (Recordset)。
在使用事務之後,可以接受或拒絕在事務中所做的更改。結束事務 (Connection)。

使用方法

一旦安裝了ADO,在VB的工程->引用對話框中你就可以看到象下圖所示的東西了:
選擇 “ActiveX Data Objects 1.5 Library” (ADODB).在其下的 "ADO Recordset 1.5 Library"是一個客戶端的版本(ADOR),它定義了有聚的數據訪問對象。ADOR 對於客戶端的數據訪問來說是足夠的了,因爲你不需要Connection對象來建立與遠程數據源的聯繫。
如果你想要訪問更多的外部數據源,你需要安裝這些外部數據源自己的OLE DB Provider,就象你需要爲新的數據庫系統安裝新的ODBC驅動程序一樣。如果該外部數據源沒有自己的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
按F5運行程序,看看,一個消息框彈出來告訴你連接成功了。請注意,這裏我特別註明了是ADODB.Connection,而不是ADOR.Connection,這樣做是爲了將二者區分開(如果你引用了ADODB和ADOR的話,這樣做很有必要)。連接字符串看上去同RDO的連接字符串差不多。事實上,二者確實差不多。
如果我們要訪問一個SQL server數據庫,你的Connection代碼看上去應象下面所示:
'設置連接屬性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"字段中產生頭十個不重複的國家名。修改窗體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
運行程序後,你會看到如下圖所示的消息框。
不幸的是你需要創建一個獨立的Recordset對象,該對象擁有自己的Connection屬性,就象下面的代碼所示:
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=;”, adOpenDynamic
'Report Recordset Connection information
MsgBox rs.ActiveConnection, , “Connection Info”
'Enumerate the recordset
sOut = “”
For Count = 1 To 10
sOut = sOut & rs(“ShipCountry”) & vbCrLf
rs.MoveNext
Next Count
MsgBox sOut, 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();
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章