MFC 连接数据库及封装ADO对象类ADOConn()
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename("EOF", "EndOfFile")
但要注意不能放在 stdAfx.h 文件的开头,而应该放在所有 include 指令的后面。否则在编译时会出错。
首先你正确安装了MYSQL的数据库驱动程序(mysql-connector-odbc-5.1.6-win32.msi )
1.在桌面上新建一个空的文本文件mysql.txt,重命名为mysql.udl;
2.双击这个mysql.udl文件,打开“数据库连接属性”对话框,在“提供程序”页选择”Micrsoft Ole DB Provider for ODBC Drivers“,点击下一步;
3.在“连接”页的,"指定数据源"选择"使用连接字符串";
4.点击“编译”,弹出“选择数据源”,在“文件数据源”页中点击”新建“,在创建新数据源选择MYSQL的驱动程序”MySQL ODBC 5.1 Driver";
5.点击“下一步”,点击"浏览",在”另存为“对话框中文件名称写入“mysql",点击”下一步“,点击”完成“;
6.在"MySQL Connnettor/ODBC Data Source Configuration"对话框中按需求(如下图);
7.点击“Test”,看连接是否成功,连接成功会有个”Connenction successful“提示框,需要更详细的设置点击“Details”,点击”OK“,设置完成;
8.返回“数据库连接属性”对话框,点击“测试连接”,成功的话就是我们要的连接字符串。
下面是我本机测试的ADO连接字符串,服务器localhost,数据库meismon,用户名root,密码123456
Provider=MSDASQL.1;Persist Security Info=True;Extended Properties="Driver=MySQL ODBC 5.1 Driver;SERVER=localhost;UID=root;PWD=123456;DATABASE=seismon;PORT=3306;COLUMN_SIZE_S32=1"
注:关闭“数据库连接属性”后再次双击mysql.udl打开该对话框,会因为密码丢失问题点击“测试连接”会连接不上,把“数据库连接属性”对话框上的密码等补全就可以了,用文本方式打开mysql.udl文件就是完整的连接字符串。
注:关闭“数据库连接属性”后再次双击mysql.udl打开该对话框,会因为密码丢失问题点击“测试连接”会连接不上,把“数据库连接属性”对话框上的密码等补全就可以了,用文本方式打开mysql.udl文件就是完整的连接字符串。
// ADOConn.h: interface for the ADOConn class.
//
//////////////////////////////////////////////////////////////////////
//#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename//("EOF","adoEOF") rename("BOF","adoBOF")
#if !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)
#define AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class ADOConn
{
// 定义变量
public:
_ConnectionPtr m_pConnection;//添加一个指向Connection对象的指针
_RecordsetPtr m_pRecordset; //添加一个指向Recordset对象的指针
// 定义方法
public:
ADOConn();
virtual ~ADOConn();
void OnInitADOConn(); // 初始化—连接数据库
_RecordsetPtr& GetRecordSet(_bstr_t bstrSQL); // 执行查询
BOOL ExecuteSQL(_bstr_t bstrSQL); // 执行SQL语句,Insert Update
void ExitConnect(); //断开数据库连接
void CloseRecordset(); //关闭记录集
};
#endif // !defined(AFX_ADOCONN_H__AC448F02_AF26_45E4_9B2D_D7ECB8FFCFB9__INCLUDED_)
// ADOConn.cpp: implementation of the ADOConn class.
//
//////////////////////////////////////////////////////////////////////
#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()
{
}
ADOConn::~ADOConn()
{
}
// 初始化—连接数据库
void ADOConn::OnInitADOConn()
{
::CoInitialize(NULL);// 初始化OLE/COM库环境
try
{
//m_pConnection.CreateInstance("ADODB.Connection"); // 创建Connection对象
m_pConnection.CreateInstance(__uuidof(Connection)); // 创建Connection对象
//设置链接字符串
_bstr_t strConnect="Driver=MySQL ODBC 5.1 Driver;SERVER=127.0.0.1;UID=root;DATABASE=test;PORT=3306";
m_pConnection->Open(strConnect,"root","nfz",adModeUnknown);
}
catch(_com_error e) // 捕捉异常
{
AfxMessageBox(e.Description()); // 显示错误信息
}
}
_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL) //打开记录集
{
try
{
if(m_pConnection==NULL) // 连接数据库,如果Connection对象为空,则重新连接数据库
OnInitADOConn();
m_pRecordset.CreateInstance(__uuidof(Recordset)); // 创建记录集对象
// 取得表中的记录
m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}
catch(_com_error e)
{
AfxMessageBox(e.Description()); // 显示错误信息
}
return m_pRecordset; // 返回记录集
}
// 执行SQL语句,Insert Update _variant_t
BOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL)
{
try
{
if(m_pConnection == NULL)// 是否已经连接数据库
OnInitADOConn();
// Connection对象的Execute方法:(_bstr_t CommandText,
// VARIANT * RecordsAffected, long Options )
// 其中CommandText是命令字串,通常是SQL命令。
// 参数RecordsAffected是操作完成后所影响的行数,
// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(bstrSQL,NULL,adCmdText);
return true;
}
catch(_com_error e)
{
AfxMessageBox(e.Description());
return false;
}
}
//关闭记录集
void ADOConn::CloseRecordset()
{
if (m_pRecordset != NULL)
m_pRecordset->Close();
}
// 断开连接
void ADOConn::ExitConnect()
{
m_pConnection->Close(); //关闭链接
m_pRecordset.Release(); //释放COM接口的引用计数
m_pConnection.Release(); //释放COM接口的引用计数
::CoUninitialize(); // 释放环境
}
编写好封装类: ADOConn。 在一个工程里加入该类的方法为:把该类的头文件和 cpp 文件拷贝到工程所在的文件夹里。然后在工程的工作区选择 Project->Add to Project->Files, 将这两个文件选择加入。之后,就可以在程序里应用这个类了。
参考博文: