MFC中用Ado連接數據庫

VC++中使用MFC通過ADO連接數據庫方法小結(不包括異常的捕捉)
這裏主要講MFC與SQL2000數據庫的連接。
1.在StdAfx.h頭文件中加入此句子
#import "c:\program files\common files\system\ado\msado15.dll"\
no_namespace rename("EOF","adoEOF")
2.在App類的InitInstance()函數中加入
::CoInitialize(NULL);//表示com庫的初始化 
鼠標右鍵點擊App類名添加虛函數ExitInstance() ,在其中加入代碼
::CoUninitialize();//釋放com庫。
3.獲取連接字符串。
最簡單的方法就是新建一個.txt文件,將其後綴名改爲.udl,雙擊它,在“提供程序”標籤頁中選擇“Microsoft OLE DB Provide fo Sql Server”,然後在“連接”標籤頁選擇填寫服務器、數據庫、登陸方式等信息,最後按“確定”。連接完成之後,將其用寫字板打開,第三行信息,如“Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=RuleDB_Data;Data Source=PYE”即爲連接字符串。注意,若數據庫位於本機,在選擇填寫服務器一欄可直接填寫(local),記得一定要加括號。
4.連接數據庫
在這裏引入一個編寫好的封裝類:ADOConn。該類封裝了連接數據庫,對數據庫進行添加、刪除、修改操作及獲取查詢記錄集操作的方法。用戶可直接使用,這個類的頭文件和cpp文件內容將在本文最後給出。
在一個工程里加入該類的方法爲:把該類的頭文件和cpp文件拷貝到工程所在的文件夾裏。 然後在工程的工作區選擇Project->Add to Project->Files,將這兩個文件選擇加入。
之後,就可以在程序裏應用這個類了。
首先在要用到數據庫的類的頭文件裏設一個該類的對象,即加入代碼:ADOConn m_Ado;注意:記得要先在最前面加入#include "ADOConn.h"。
在應用這個對象對數據庫進行操作之前,先對其初始化: m_Ado.OnInitADOConn(strConnect);其中strConnect即爲上面獲取的連接字符串。
若要獲取數據庫中的部分記錄集,用m_Ado.GetRecordSet(strSql);其中strSql中存放查詢語句,查詢結果存放於m_Ado.m_pRecordset中,然後可用GetCollect()函數挨個獲取所有符合條件的記錄的各個字段的值。用完後記得用m_Ado.m_pRecordset.Close()關閉記錄集。
添加、修改、刪除操作,均用 m_Ado.ExecuteSQL(strSql);語句完成。
此外,若同時需要多種記錄集,則還需在要用到數據庫的類的頭文件裏添加記錄集的對象,即_RecordsetPtr m_pRecordset; m_pRecordset在用之前也需初始化,初始化語句爲: m_pRecordset.CreateInstance(__uuidof(Recordset));,同樣的,每回記錄集用完之後也得用Close()函數關閉。
5.若在數據庫應用程序編譯時遇到102個錯誤,則可把Debug文件夾刪了重新編譯即可。

ADOConn類的頭文件:

#if !defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)
#define AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn : public CObject 
{
public:
	//添加一個指向Connection對象的指針:
	_ConnectionPtr m_pConnection;
	//添加一個指向Recordset對象的指針:
	_RecordsetPtr m_pRecordset;
	char error[1024];
public:
	_ConnectionPtr& GetConnPtr()    {return m_pConnection;}
	_RecordsetPtr& GetRecoPtr()     {return m_pRecordset;}
public:
	//事務回滾
	BOOL RollbackTrans();
	//遞交 事務
	BOOL CommitTrans();
	//事務開始
	BOOL BeginTrans();
	BOOL adoBOF();//頭
	BOOL adoEOF();//尾
	BOOL MoveNext();//下一個
	BOOL CloseTable();//關閉表
	BOOL CloseADOConnection();//關閉連接
	BOOL GetCollect(LPCTSTR Name,CString &lpDest);//獲取某個字段的值
	//執行SQL語句 包含update delete insert
	BOOL ExecuteSQL(LPCTSTR lpszSQL);
	//初始化連接數據庫
	BOOL OnInitADOConn(LPCTSTR ConnStr);
	// 執行select語句 獲取記錄集 
	_RecordsetPtr& GetRecordSet(LPCTSTR lpszSQL);
	ADOConn();
	virtual ~ADOConn();
};
#endif // !defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)
class CADOException : public CException  
{
public:
	// Constructor
	CADOException(char* pchMessage);

public:
	~CADOException() {}
	CString m_strMessage;
	virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,
		PUINT pnHelpContext = NULL);
private:
	int m_nError;

};

ADOConn類的cpp文件:

#include "stdafx.h"
#include "ADOConn.h"
#ifdef _DEBUG
#undef THIS_FILE
	static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
ADOConn::ADOConn()
{
	memset(error,0,1024);

}
ADOConn::~ADOConn()
{
}
//////////////////////////////////////////////////////////////////////
// CADOException Class
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CADOException::CADOException(char* pchMessage)
{
	m_strMessage = pchMessage;
	m_nError = GetLastError();
}
BOOL CADOException::GetErrorMessage(LPTSTR lpstrError, UINT nMaxError,PUINT pnHelpContext /*= NULL*/)
{

	char text[200];
	if(m_nError == 0) 
	{
		wsprintf(text, "%s error", (const char*) m_strMessage);
	}
	else 
	{
		wsprintf(text, "%s error #%d", (const char*) m_strMessage, m_nError);
	}
	strncpy(lpstrError, text, nMaxError - 1);
	return TRUE;
}
BOOL ADOConn::OnInitADOConn(LPCTSTR ConnStr)
{
	::CoInitialize(NULL);

	try
	{
		// 創建Connection對象
		m_pConnection.CreateInstance("ADODB.Connection");
		// 設置連接字符串,必須是BSTR型或者_bstr_t類型
		_bstr_t strConnect = _bstr_t(ConnStr);//"Provider=SQLOLEDB; Server=127.0.0.1;Database=EventLogg; uid=event; pwd=event;";
		m_pConnection->Open(strConnect,"","",adModeUnknown);
		return TRUE;
	}
	// 捕捉異常
	catch(_com_error e)
	{
		// 顯示錯誤信息
		TRACE(e.Description());
		//  sprintf(error,"連接數據庫失敗 請檢查連接字符串\r\n當前連接字符串爲:%s",ConnStr);
		//  throw new CADOException(error);
		throw new CADOException("連接數據庫失敗");
	}

}
//執行SQL語句  包含update delete insert
BOOL ADOConn::ExecuteSQL(LPCTSTR lpszSQL)
{
	// _variant_t RecordsAffected;
	try
	{
		// Connection對象的Execute方法:(_bstr_t CommandText, 
		// VARIANT * RecordsAffected, long Options ) 
		// 其中CommandText是命令字串,通常是SQL命令。
		// 參數RecordsAffected是操作完成後所影響的行數, 
		// 參數Options表示CommandText的類型:adCmdText-文本命令;adCmdTable-表名
		// adCmdProc-存儲過程;adCmdUnknown-未知
		m_pConnection->Execute(_bstr_t(lpszSQL),NULL,adCmdText);
		return true;
	}
	catch(_com_error e)
	{
		TRACE(e.Description());
		//  sprintf(error,"\t執行SQL語句失敗\r\n SQL語句爲:%s",lpszSQL);
		//  throw new CADOException(error);
		throw new CADOException("執行SQL語句失敗");
	}

}
//執行SELECT語句,獲得結果集,結果集放在m_pRecordset中
_RecordsetPtr& ADOConn::GetRecordSet(LPCTSTR lpszSQL)
{
	try
	{
		// 創建記錄集對象
		m_pRecordset.CreateInstance(__uuidof(Recordset));
		// 取得表中的記錄
		m_pRecordset->Open(_bstr_t(lpszSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
	}
	// 捕捉異常
	catch(_com_error e)
	{
		// 顯示錯誤信息
		TRACE(e.Description());
		//  sprintf(error,"\t執行SELECT語句失敗\r\nSELECT語句爲:%s",lpszSQL);
		//  throw new CADOException(error);
		throw new  CADOException("執行SELECT語句失敗");
	}
	// 返回記錄集
	return m_pRecordset;
}
//獲取某個字段的值
BOOL ADOConn::GetCollect(LPCTSTR Name,CString &lpDest)
{
	VARIANT  vt;
	try
	{
		vt = m_pRecordset->GetCollect(Name);
		/* _bstr_t bstr = (_bstr_t)vt;
		if(lpDest != "")
		{
		strcpy(lpDest,bstr);
		}*/
		if(vt.vt!=VT_NULL)
			lpDest=(LPCSTR)_bstr_t(vt);
		else
			lpDest="";

	}
	catch (_com_error e)
	{
		TRACE(e.Description());
		sprintf(error,"獲取字段:%s值失敗",Name);
		throw new CADOException(error);
	}
	return TRUE;
}
//關閉數據庫 
BOOL ADOConn::CloseADOConnection()
{
	try
	{
		m_pConnection->Close();
	}
	catch (_com_error e)
	{
		TRACE(e.Description());
		sprintf(error,e.Description());
		throw new CADOException("關閉數據庫失敗");
	}
	return TRUE;
}
//關表
BOOL ADOConn::CloseTable()
{
	try
	{
		m_pRecordset->Close();
	}
	catch (_com_error e)
	{
		TRACE(e.Description());
		sprintf(error,e.Description());
		throw new CADOException("關閉表失敗");
	}
	return TRUE;
}
//下一個
BOOL ADOConn::MoveNext()
{
	try
	{
		m_pRecordset->MoveNext();
	}
	catch (_com_error e)
	{
		TRACE(e.Description());
		sprintf(error,e.Description());
		throw new CADOException("結果集移向下一個失敗");
	}
	return TRUE;
}
//尾
BOOL ADOConn::adoEOF()
{
	return m_pRecordset->adoEOF;
}
//頭
BOOL ADOConn::adoBOF()
{
	return m_pRecordset->BOF;
}
//事務開始
BOOL ADOConn::BeginTrans()
{
	try
	{
		m_pConnection->BeginTrans();
	}
	catch (_com_error e) 
	{
		TRACE(e.Description());
		sprintf(error,e.Description());
		throw new CADOException("事務開始失敗");
	} 
	return TRUE;
}
//遞交事務
BOOL ADOConn::CommitTrans()
{
	try
	{
		m_pConnection->CommitTrans();
	}
	catch (_com_error e)
	{
		TRACE(e.Description());
		sprintf(error,e.Description());
		throw new CADOException("遞交事務失敗");
	}
	return TRUE;
}
//事務回滾
BOOL ADOConn::RollbackTrans()
{
	try
	{
		m_pConnection->RollbackTrans();
	}
	catch (_com_error e)
	{
		TRACE(e.Description());
		sprintf(error,e.Description());
		throw new CADOException("回滾事務失敗");
	}
	return TRUE;
}


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