1.设置数据源
打开控制面板--->系统和安全--->管理工具--->ODBC Data Sources(32 bit) 这里需要注意的是,vc6.0是32位的,因此这里的数据源也必须是32位的,否则是连接不上的,
这里我使用的是ACCESS数据库,数据源的配置如下:
2.创建包含数据库的MFC对话框(其它也可以)工程,新建ADOConn类
在工程中我们需要新建一个普通类ADOConn
然后在ADOConn类头文件中加入以下导入声明和变量、函数声明:
ADOConn.h--------------------------------------------------------------------------------- #import \no_namespace rename(\引入ADO库文件
public:
_ConnectionPtr m_pConnection;//连接对象指针 _RecordsetPtr m_pRecordset;//记录集对象指针 _CommandPtr m_pCommand;//命令对象指针 ADOConn();
virtual ~ADOConn();
BOOL OnInitADOConn(CString Connstr);//初始化连接数据库 BOOL ExecuteSQL(CString strSQL);//执行SQL语句 BOOL ExecuteProc(CString ProcName);//执行存储过程
BOOL GetCollect(CString FieldName,CString & strDest);//获得某个字段的值 BOOL GetRecordSet(CString strSQL);//获得记录集 int GetRecordCount();//获得记录数
//判断表TableName中是否存在字段KeyName的值为KeyValue的记录 BOOL RecordExist(CString TableName,CString KeyName,CString KeyValue); BOOL MoveFirst();//移动到第一条记录 BOOL MoveNext();//移动到下一条记录 BOOL Close();//关闭记录集
BOOL CloseADOConnection();//关闭连接
void dump_com_error(_com_error &e);//错误详细信息
ADOConn.h---------------------------------------------------------------------------------
然后在ADOConn类源文件中加入函数实现:
ADOConn.cpp--------------------------------------------------------------------------------- ADOConn::ADOConn()//构造函数 { }
ADOConn::~ADOConn()//析构函数 {
}
BOOL ADOConn::OnInitADOConn(CString ConnStr)//初始化连接数据库 {
try{
m_pRecordset.CreateInstance(\ m_pCommand.CreateInstance(\ m_pConnection.CreateInstance(\ _bstr_t strConnect=(_bstr_t)ConnStr;
m_pConnection->Open((_bstr_t)strConnect,\ AfxMessageBox(\数据库连接成功\ return true;
}catch(_com_error e){
AfxMessageBox(\数据库连接失败\ return false; } }
BOOL ADOConn::ExecuteSQL(CString strSQL)//执行SQL语句 {
try{
m_pConnection->BeginTrans();
m_pConnection->Execute(_bstr_t(strSQL),NULL,adCmdText); m_pConnection->CommitTrans(); return true; }catch(_com_error e) {
m_pConnection->RollbackTrans();
AfxMessageBox(\执行SQL语句失败\ return false; } }
BOOL ADOConn::ExecuteProc(CString ProcName)//执行存储过程 {
try{
m_pCommand->ActiveConnection=m_pConnection; m_pCommand->CommandText=_bstr_t(ProcName); m_pCommand->Execute(NULL,NULL,adCmdStoredProc); return true;
}catch(_com_error e){
AfxMessageBox(\执行存储过程失败\ return false; } }
BOOL ADOConn::GetCollect(CString FieldName,CString & strDest)//获得某个字段的值 {
VARIANT vt; try{
vt=m_pRecordset->GetCollect(_variant_t(FieldName)); switch(vt.vt){ case VT_BSTR:
strDest=(LPCSTR)_bstr_t(vt); break; case VT_DECIMAL:
strDest.Format(\ break; case VT_DATE: {
DATE dt=vt.date;
COleDateTime da=COleDateTime(dt);
strDest.Format(\GetDay(),da.GetHour(),da.GetMinute(),da.GetSecond()); break; }
case VT_NULL:
strDest=\ break; }
return true;
}catch(_com_error e){
AfxMessageBox(e.ErrorMessage()); return false; }
return true; }
BOOL ADOConn::GetRecordSet(CString strSQL)//获得记录集 {
try{
m_pCommand->CommandText=(_bstr_t)strSQL; m_pCommand->ActiveConnection=m_pConnection; m_pCommand->CommandType=adCmdText;
m_pRecordset=m_pCommand->Execute(NULL,NULL,adCmdText); return true;
}catch(_com_error e) {
AfxMessageBox(\执行select语句失败\ return false; } }
int ADOConn::GetRecordCount()//获得记录数 {
DWORD nRows = 0;
nRows=m_pRecordset->GetRecordCount(); if(nRows==-1) {
nRows=0;
if(m_pRecordset->adoEOF!=VARIANT_TRUE) m_pRecordset->MoveFirst(); while(m_pRecordset->adoEOF!=VARIANT_TRUE) {
nRows++;
m_pRecordset->MoveNext(); }
if(nRows>0)m_pRecordset->MoveFirst(); }
return nRows; }
//判断表TableName中是否存在字段KeyName的值为KeyValue的记录
BOOL ADOConn::RecordExist(CString TableName,CString KeyName,CString KeyValue) {
CString countstr;
countstr=\ BOOL ret =GetRecordSet(countstr); if(ret) {
int ret2=GetRecordCount(); if(ret2) return true; else return false; }
else return false; }