C++ ADO操作mysql数据库
来源:互联网 发布:高级算法工程师年薪 编辑:程序博客网 时间:2024/05/22 14:34
从我接触的数据库编程方式来说, 我觉得在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;
- 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);
"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可以很方便开发程序.
- 用ADO操作MYSQL数据库
- C++ ADO操作mysql数据库
- ADO.NET操作MySQL数据库
- ADO.NET操作MySQL数据库
- C++ ADO操作mysql数据库
- C操作MYSQL数据库
- VC中用ADO操作MySql数据库中文问题
- ADO操作Oracle\DB2\MySQL数据库CLOB\LONGTEXT备忘
- ADO 操作SqlServer数据库
- 初学ADO操作数据库!
- ADO数据库操作总结
- ado操作数据库
- ADO数据库操作(ACCESS)
- ADO操作ACESS数据库
- ADO数据库操作
- ADO操作数据库
- [MFC]ADO操作数据库
- ADO操作数据库
- JavaScript常用代码总结一
- Learn git with bitbucket-cloud
- fastJson使用实例
- python 网络编程中遇到的问题
- java 数据结构之Vetor
- C++ ADO操作mysql数据库
- 匈牙利算法
- stm32 IO 设置
- 项目总结(三)——复制文件时显示进度对话框
- Comprehensive learning path – Data Science in Python
- Python 环境搭建
- python3处理http请求的包
- Java动态拼接SQL--03--JdbcTemple
- 小程序中点击事件传参