C++ ADO方式连接mysql数据库

对于软件开发其实说白了就是在不停地和数据打交道, 所以数据库的操作是必不可少的, 接下来介绍VC开发中利用ADO建立ODBC数据源来访问MySQL数据库.

从我接触的数据库编程方式来说, 我觉得在vc开发连接数据库是比较难的, 也是很容易出错. 在android中, 系统自带sqlite数据库,只需要使用SQLiteOpenHelper抽象类即可完成与数据库的操作. 在java中, 使用jdbc连接mysql数据库, 下载相应jar调用相应接口,传入数据库类型与用户名密码进行数据库的操作. 但是ado连接数据库比较复杂, 接下来我们看一下如何使用ado连接数据库.

一. 安装mysql

首先你需要确保电脑上已经安装了mysql数据库, 并使用用户名与密码成功使用mysql. 如何安装配置mysql, 这里不做详细介绍.

如果不了解如何安装配置mysql可以参考这个地址:点击打开链接

二.  ADO方式连接MySql

1. 导入ado数据库, 在你的程序中添加下面语句来导入ado数据库

// no_namespace rename("EOF", "adoEOF")防止命名重复,将EOF重命名为adoEOF

#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") 

2. 初始化com环境

//初始化com环境
AfxOleInit();

3. 创建数据表结构,用来保存从数据库中获取的内容

假设数据表只有两个字段:用户ID与用户名

typedef struct _OBJ_USER
{
	int User_ID;
	TCHAR User_Name[32];
}OBJ_USER;

4.创建操作数据库的类operator类

class CDataOperator
{
public:
	CDataOperator();
	~CDataOperator();
public:
	//打开指定的数据库
	BOOL OpenDatabase(CString strDbName, CString strUserName, CString strUserPwd);
public:
	//执行sql语句,增加数据,删除数据
	BOOL ExecuteSQL(CString sql);
	//查询数据
	BOOL Select_From_User(vector<OBJ_USER> &vecObjUser);
	//插入数据, 可以插入图片,二进制数据(大数据)
	BOOL Insert_Into_User(OBJ_USER &objUser);
	//更新数据, 可更新大数据
	BOOL Update_For_User(OBJ_USER &objUser);
public:
	//连接对象
	_ConnectionPtr m_pConnection;
};

5. operator类的定义

CDataOperator::CDataOperator()
{
	try
	{
		//创建连接对象
		HRESULT hr = m_pConnection.CreateInstance(_T("ADODB.Connection"));
		if (FAILED(hr))
		{
			m_pConnection = NULL;
		}
	}
	catch (_com_error &e)
	{
		e.ErrorMessage();
	}
}

CDataOperator::~CDataOperator()
{
    if (m_pConnection)
    {
        try
        {
            //将连接对象关闭
            HRESULT hr = m_pConnection->Close();
        }
        catch (_com_error &e)
        {
            e.ErrorMessage();
        }
        //释放连接对象
        m_pConnection.Release();
        m_pConnection = NULL;
    }
}

//打开数据库的操作
BOOL CDataOperator::OpenDatabase(CString strDbName, CString strUserName, CString strUserPwd)
{
    if (NULL == m_pConnection)
    {
        return FALSE;
    }
    if (m_pConnection)
    {
        try
        {
            CString strConnectionName;
            strConnectionName.Format(_T("DATABASE=%s;DSN=myodbc;OPTION=0;PWD=%s;PORT=0;SERVER=localhost;UID=%s;"),
                strDbName, strUserPwd, strUserName);
            HRESULT hr = m_pConnection->Open(_bstr_t(strConnectionName.GetBuffer(0)),
                _T(""), _T(""), -1);
            if (FAILED(hr))
            {
                m_pConnection = NULL;
            }
        }
        catch (_com_error &e)
        {
            e.ErrorInfo();
            return FALSE;
        }
    }
    return true;
}

获取连接字符串的方法:

strConnectionName.Format(_T("DATABASE=%s;DSN=myodbc;OPTION=0;PWD=%s;PORT=0;SERVER=localhost;UID=%s;"),
                strDbName, strUserPwd, strUserName);

连接字符串中包含的信息包括数据库的类型, 数据库的用户名与密码, 在这里和java用jdbc连接数据库类似, 获取连接字符串:

"DATABASE=%s;DSN=myodbc;OPTION=0;PWD=%s;PORT=0;SERVER=localhost;UID=%s;" 的方式如下:

(1) 首先需要安装mysql-connector-odbc-3.51.26-win32.ini, 才能连接mysql数据库

(2) 新建一个txt文件,后缀名改为.udl,双击打开

(3) 提供程序-->Microsoft OLE DB Provider for ODBC Drivers,点击‘下一步’,选择‘使用连接字符串’,

点击‘编译’,选择‘机器数据源’,点击‘新建’,点击‘下一步’,选择MYSQL(如果你安装了第一步中的应用会有MYSQL驱动程序)点击‘下一步’,

然后填写相应的内容,需要连接的数据库,server,用户名,密码等,点击test按钮,测试是否连接成功,连接成功,保存。

(4) 用记事本打开文件就获取到了连接字符串。

6. CDataOperator类执行sql语句操作的接口

BOOL CDataOperator::ExecuteSQL(CString sql)
{
	if (NULL == m_pConnection)
	{
		return FALSE;
	}
	if (m_pConnection)
	{
		try
		{
			HRESULT hr = m_pConnection->Execute(_bstr_t(sql), NULL, 1);
			if (FAILED(hr))
			{
				m_pConnection = NULL;
			}
		}
		catch (_com_error &e)
		{
			e.ErrorMessage();
			return FALSE;
		}
	}
	return true;
}

7. 从数据库中获取数据

BOOL CDataOperator::Select_From_User(vector<OBJ_USER> &vecObjUser)
{
	if (NULL == m_pConnection)
		return FALSE;
	//记录集对象
	_RecordsetPtr m_pRecordSet;
	HRESULT hr = m_pRecordSet.CreateInstance(_T("ADODB.Recordset"));
	if (FAILED(hr))
	{
		return FALSE;
	}
	//获取数据前先清空
	vecObjUser.clear();
	CString strSQL = _T("select User_ID, User_Name from user");
	hr = m_pRecordSet->Open(_bstr_t(strSQL),m_pConnection.GetInterfacePtr(),
		adOpenStatic, adLockOptimistic, adCmdText);
	if (FAILED(hr))
	{
		m_pRecordSet.Release();
		return FALSE;
	}
	//获取当前游标的位置
	VARIANT_BOOL bRet = m_pRecordSet->GetadoEOF();
	//如果游标在末尾返回失败
	//遍历数据
	while(!bRet)
	{
		_variant_t varUserID = m_pRecordSet->GetCollect("User_ID");
		_variant_t varUserName = m_pRecordSet->GetCollect("User_Name");
		OBJ_USER objUser;
		objUser.User_ID = varUserID.intVal;
		_tcscpy_s(objUser.User_Name, (TCHAR*)(_bstr_t)varUserName);
		vecObjUser.push_back(objUser);
		//游标下移
		m_pRecordSet->MoveNext();
		bRet = m_pRecordSet->GetadoEOF();
	}
	m_pRecordSet->Close();
	m_pRecordSet.Release();
	m_pRecordSet = NULL;
	return true;
}

8. 往数据库中插入数据(可以插入图片,二进制大数据等)

我们通过CDataOperator::ExecuteSQL方法, 通过传入插入sql语句可以实现往数据中插入数据, 但是插入图片或二进制大数据这种方式并不适合.所以单独将插入与更新操作实现,支持大数据的操作

BOOL CDataOperator::Insert_Into_User(OBJ_USER &objUser)
{
	if (NULL == m_pConnection)
		return FALSE;
	//记录集对象
	_RecordsetPtr m_pRecordSet;
	HRESULT hr = m_pRecordSet.CreateInstance(_T("ADODB.Recordset"));
	if (FAILED(hr))
	{
		return FALSE;
	}
	CString strSQL = _T("select User_ID, User_Name from user");
	hr = m_pRecordSet->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),
		adOpenStatic, adLockOptimistic, adCmdText);
	if (FAILED(hr))
	{
		m_pRecordSet.Release();
		return FALSE;
	}

	try
	{
		//增加一行
		m_pRecordSet->AddNew();
	}
	catch (_com_error &e)
	{
		e.ErrorMessage();
		return FALSE;
	}
	try
	{
		m_pRecordSet->PutCollect(_T("User_ID"), _variant_t(objUser.User_ID));
		m_pRecordSet->PutCollect(_T("User_Name"), _variant_t(objUser.User_Name));
	}
	catch (_com_error &e)
	{
		m_pRecordSet->Close();
		m_pRecordSet.Release();
		e.ErrorMessage();
		return FALSE;
	}
	m_pRecordSet->Update();
	m_pRecordSet->Close();
	m_pRecordSet.Release();
	m_pRecordSet = NULL;
	return TRUE;
}

9. 更新数据库中的数据

BOOL CDataOperator::Update_For_User(OBJ_USER &objUser)
{
	if (NULL == m_pConnection)
		return FALSE;
	//记录集对象
	_RecordsetPtr m_pRecordSet;
	HRESULT hr = m_pRecordSet.CreateInstance(_T("ADODB.Recordset"));
	if (FAILED(hr))
	{
		return FALSE;
	}
	CString strSQL;
	strSQL.Format(_T("select User_ID, User_Name from user where User_ID=%d"), objUser.User_ID);
	hr = m_pRecordSet->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),
		adOpenStatic, adLockOptimistic, adCmdText);
	if (FAILED(hr))
	{
		m_pRecordSet.Release();
		return FALSE;
	}
	try
	{
		m_pRecordSet->PutCollect(_T("User_Name"), _variant_t(objUser.User_Name));
	}
	catch (_com_error &e)
	{
		m_pRecordSet->Close();
		m_pRecordSet.Release();
		e.ErrorMessage();
		return FALSE;
	}
	m_pRecordSet->Update();
	m_pRecordSet->Close();
	m_pRecordSet.Release();
	m_pRecordSet = NULL;
	return TRUE;
}

至此, ado方式连接MySQL数据库的步骤介绍完毕, 最难的地方我觉得是获取连接字符串和数据库连接对象的使用. 数据库类CDataOperator,实现了数据库连接,

数据库操作:增, 删, 改, 查操作. 以后在vc开发时用到数据库时, 使用CDataOperator可以很方便开发程序.

时间: 2024-10-26 15:50:04

C++ ADO方式连接mysql数据库的相关文章

jmeter中通过jdbc方式连接mysql数据库的配置参考

jmeter中通过jdbc方式连接mysql数据库的配置参考: Database URL=jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=UTF-8 JDBC Driver class=com.mysql.jdbc.Driver jmeter中配置截图:

SSIS ODBC方式连接mysql数据库的一个问题

开发工具 vs2010 ssdt 最近项目中需要将ms sqlserver 数据库和mysql数据库进行数据交互集成,在SSIS包开发过程中,Mysql odbc connector 插件的安装费 了不少时间.我下载了5.3.4版本的mysqlconnector . OS系统是win8,1 64 位,所以对应安装了64位的插件. 在控制面板找到管理工具然后设置ODBC源时也一切正常 test connection successful. 设置完成在SSIS包新建mysql数据库连接时,却发现插件

win7 64 VC++ ado方式连接access 连接字符串

运行环境:win7 64       vc++6.0       office 2007  32位(access 2007) 我用的是ado方式连接access数据库,(现在的Win7系统中安装的一般都是32位的Office,因为微软推荐使用32位的Office,兼容性更强,稳定性更好.access文件是.mdb(2003格式,会提示没有jet访问组件) .accdb(2007格式)),因此需要安装AccessDatabaseEngine_X64.exe驱动,安装时会提示先卸载office再安装

服务器重启后 django无法连接mysql数据库的解决方法

问题描述: 远程linux服务器,centOS7系统 采用uwsgi+django+pymysql的方式连接mysql数据库. 在服务器重启之后, 启用uwsgi之后(直接运行django运行命令也是一样python manage.py runserver), 无法连接到数据库. 报错: cryptography is required for sha256_password or caching_sha2_password 解决方法: 1. 手动连接数据库一次 mysql -u root -p

使用EntityFramework6连接MySql数据库(db first方式)

查看了 逆水寒龙前辈的 使用EntityFramework6连接MySql数据库(db first方式) 自己亲自实践 遇到一点问 mysql-connector-net-x.x.x.msi mysql-for-visualstudio-x.x.x.msi 这两个东西需要使用最新版本,老版本装不上. 安装nuget包 不需要带版本号 Install-Package EntityFramework Install-Package MySql.Data.Entity 带版本号也会出现这个错误 提醒一

PHP连接MySQL数据库的几种方式

PHP 5 及以上版本建议使用以下方式连接 MySQL : MySQLi :MySQLi 只针对 MySQL 数据库,MySQLi 还提供了 API 接口. PDO (PHP Data Objects):PDO 应用在 12 种不同数据库中. 共同点: 1. 两者都是面向对象 2. 两者都支持预处理语句. 预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的. 确保wamp里已经安装好了MySQLi或PDO,查看方式:echo phpinfo(); 接下来将会使用以下三种方式

【php】Apache无法自己主动跳转却显示文件夹与php无法连接mysql数据库的解决方式

一.Apache无法自己主动跳转却显示文件夹 Apache无法自己主动跳转却显示文件夹这是由于Apacheserver下conf/httpd.conf没有配置好,其默认是不跳转,直接显示文件夹 首先,我们须要禁止Apache直接显示文件夹. 方法在搜索Options Indexes FollowSymLinks,将其该为Options FollowSymLinks 事实上.解决Apache无法自己主动跳转的问题.这是由于Apache本来仅仅是一个httpserver.不会自己主动跳转到index

C++连接mysql数据库的两种方法

现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多.通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法.可以通过2种方法实现. 第一种方法是利用ADO连接, 第二种方法是利用mysql自己的api函数进行连接. 第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库.暂时只连接了mysql,sqlserver,oracle,access.对于access,因为它创建表的

如何用C# 连接MySQL数据库

我们可以通过两种方式来连接MySQL数据库,先看直联的方式: 方法一: 使用MySQL推出的MySQL Connector/Net组件, 该组件是MySQL为ADO.NET访问MySQL数据库设计的.NET专用访问组件.完成该组件后,需要在项目中引用这个组件,   之后在程序中引用命名空间MySql.Data.MySqlClient,即可开始进行连接MySQL数据库的操作了,示例如下:    1protected void MySqlCon()  2{  3        //数据库连接字符串跟