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;
}


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值