C++ ADO操作mysql数据库

来源:互联网 发布:高级算法工程师年薪 编辑:程序博客网 时间:2024/05/22 14:34
 对于软件开发其实说白了就是在不停地和数据打交道, 所以数据库的操作是必不可少的, 接下来介绍VC开发中利用ADO建立ODBC数据源来访问MySQL数据库.

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

一. 安装mysql

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

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


二.  ADO方式连接MySql

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

[cpp] view plain copy print?
  1. // no_namespace rename("EOF", "adoEOF")防止命名重复,将EOF重命名为adoEOF  
  2.   
  3. #import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF")   

 2. 初始化com环境


[cpp] view plain copy print?
  1. //初始化com环境  
  2. AfxOleInit();  

3. 创建数据表结构,用来保存从数据库中获取的内容
假设数据表只有两个字段:用户ID与用户名

[cpp] view plain copy print?
  1. typedef struct _OBJ_USER  
  2. {  
  3.     int User_ID;  
  4.     TCHAR User_Name[32];  
  5. }OBJ_USER;  
4.创建操作数据库的类operator类

[cpp] view plain copy print?
  1. class CDataOperator  
  2. {  
  3. public:  
  4.     CDataOperator();  
  5.     ~CDataOperator();  
  6. public:  
  7.     //打开指定的数据库  
  8.     BOOL OpenDatabase(CString strDbName, CString strUserName, CString strUserPwd);  
  9. public:  
  10.     //执行sql语句,增加数据,删除数据  
  11.     BOOL ExecuteSQL(CString sql);  
  12.     //查询数据  
  13.     BOOL Select_From_User(vector<OBJ_USER> &vecObjUser);  
  14.     //插入数据, 可以插入图片,二进制数据(大数据)  
  15.     BOOL Insert_Into_User(OBJ_USER &objUser);  
  16.     //更新数据, 可更新大数据  
  17.     BOOL Update_For_User(OBJ_USER &objUser);  
  18. public:  
  19.     //连接对象  
  20.     _ConnectionPtr m_pConnection;  
  21. };  

5. operator类的定义

[cpp] view plain copy print?
  1. CDataOperator::CDataOperator()  
  2. {  
  3.     try  
  4.     {  
  5.         //创建连接对象  
  6.         HRESULT hr = m_pConnection.CreateInstance(_T("ADODB.Connection"));  
  7.         if (FAILED(hr))  
  8.         {  
  9.             m_pConnection = NULL;  
  10.         }  
  11.     }  
  12.     catch (_com_error &e)  
  13.     {  
  14.         e.ErrorMessage();  
  15.     }  
  16. }  
  17.   
  18. CDataOperator::~CDataOperator()  
  19. {  
  20.     if (m_pConnection)  
  21.     {  
  22.         try  
  23.         {  
  24.             //将连接对象关闭  
  25.             HRESULT hr = m_pConnection->Close();  
  26.         }  
  27.         catch (_com_error &e)  
  28.         {  
  29.             e.ErrorMessage();  
  30.         }  
  31.         //释放连接对象  
  32.         m_pConnection.Release();  
  33.         m_pConnection = NULL;  
  34.     }  
  35. }  
  36.   
  37. //打开数据库的操作  
  38. BOOL CDataOperator::OpenDatabase(CString strDbName, CString strUserName, CString strUserPwd)  
  39. {  
  40.     if (NULL == m_pConnection)  
  41.     {  
  42.         return FALSE;  
  43.     }  
  44.     if (m_pConnection)  
  45.     {  
  46.         try  
  47.         {  
  48.             CString strConnectionName;  
  49.             strConnectionName.Format(_T("DATABASE=%s;DSN=myodbc;OPTION=0;PWD=%s;PORT=0;SERVER=localhost;UID=%s;"),  
  50.                 strDbName, strUserPwd, strUserName);  
  51.             HRESULT hr = m_pConnection->Open(_bstr_t(strConnectionName.GetBuffer(0)),  
  52.                 _T(""), _T(""), -1);  
  53.             if (FAILED(hr))  
  54.             {  
  55.                 m_pConnection = NULL;  
  56.             }  
  57.         }  
  58.         catch (_com_error &e)  
  59.         {  
  60.             e.ErrorInfo();  
  61.             return FALSE;  
  62.         }  
  63.     }  
  64.     return true;  
  65. }  

获取连接字符串的方法:

[cpp] view plain copy print?
  1. strConnectionName.Format(_T("DATABASE=%s;DSN=myodbc;OPTION=0;PWD=%s;PORT=0;SERVER=localhost;UID=%s;"),  
  2.                 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语句操作的接口

[cpp] view plain copy print?
  1. BOOL CDataOperator::ExecuteSQL(CString sql)  
  2. {  
  3.     if (NULL == m_pConnection)  
  4.     {  
  5.         return FALSE;  
  6.     }  
  7.     if (m_pConnection)  
  8.     {  
  9.         try  
  10.         {  
  11.             HRESULT hr = m_pConnection->Execute(_bstr_t(sql), NULL, 1);  
  12.             if (FAILED(hr))  
  13.             {  
  14.                 m_pConnection = NULL;  
  15.             }  
  16.         }  
  17.         catch (_com_error &e)  
  18.         {  
  19.             e.ErrorMessage();  
  20.             return FALSE;  
  21.         }  
  22.     }  
  23.     return true;  
  24. }  

7. 从数据库中获取数据

[cpp] view plain copy print?
  1. BOOL CDataOperator::Select_From_User(vector<OBJ_USER> &vecObjUser)  
  2. {  
  3.     if (NULL == m_pConnection)  
  4.         return FALSE;  
  5.     //记录集对象  
  6.     _RecordsetPtr m_pRecordSet;  
  7.     HRESULT hr = m_pRecordSet.CreateInstance(_T("ADODB.Recordset"));  
  8.     if (FAILED(hr))  
  9.     {  
  10.         return FALSE;  
  11.     }  
  12.     //获取数据前先清空  
  13.     vecObjUser.clear();  
  14.     CString strSQL = _T("select User_ID, User_Name from user");  
  15.     hr = m_pRecordSet->Open(_bstr_t(strSQL),m_pConnection.GetInterfacePtr(),  
  16.         adOpenStatic, adLockOptimistic, adCmdText);  
  17.     if (FAILED(hr))  
  18.     {  
  19.         m_pRecordSet.Release();  
  20.         return FALSE;  
  21.     }  
  22.     //获取当前游标的位置  
  23.     VARIANT_BOOL bRet = m_pRecordSet->GetadoEOF();  
  24.     //如果游标在末尾返回失败  
  25.     //遍历数据  
  26.     while(!bRet)  
  27.     {  
  28.         _variant_t varUserID = m_pRecordSet->GetCollect("User_ID");  
  29.         _variant_t varUserName = m_pRecordSet->GetCollect("User_Name");  
  30.         OBJ_USER objUser;  
  31.         objUser.User_ID = varUserID.intVal;  
  32.         _tcscpy_s(objUser.User_Name, (TCHAR*)(_bstr_t)varUserName);  
  33.         vecObjUser.push_back(objUser);  
  34.         //游标下移  
  35.         m_pRecordSet->MoveNext();  
  36.         bRet = m_pRecordSet->GetadoEOF();  
  37.     }  
  38.     m_pRecordSet->Close();  
  39.     m_pRecordSet.Release();  
  40.     m_pRecordSet = NULL;  
  41.     return true;  
  42. }  

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

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

[cpp] view plain copy print?
  1. BOOL CDataOperator::Insert_Into_User(OBJ_USER &objUser)  
  2. {  
  3.     if (NULL == m_pConnection)  
  4.         return FALSE;  
  5.     //记录集对象  
  6.     _RecordsetPtr m_pRecordSet;  
  7.     HRESULT hr = m_pRecordSet.CreateInstance(_T("ADODB.Recordset"));  
  8.     if (FAILED(hr))  
  9.     {  
  10.         return FALSE;  
  11.     }  
  12.     CString strSQL = _T("select User_ID, User_Name from user");  
  13.     hr = m_pRecordSet->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),  
  14.         adOpenStatic, adLockOptimistic, adCmdText);  
  15.     if (FAILED(hr))  
  16.     {  
  17.         m_pRecordSet.Release();  
  18.         return FALSE;  
  19.     }  
  20.       
  21.     try  
  22.     {  
  23.         //增加一行  
  24.         m_pRecordSet->AddNew();  
  25.     }  
  26.     catch (_com_error &e)  
  27.     {  
  28.         e.ErrorMessage();  
  29.         return FALSE;  
  30.     }  
  31.     try  
  32.     {  
  33.         m_pRecordSet->PutCollect(_T("User_ID"), _variant_t(objUser.User_ID));  
  34.         m_pRecordSet->PutCollect(_T("User_Name"), _variant_t(objUser.User_Name));  
  35.     }  
  36.     catch (_com_error &e)  
  37.     {  
  38.         m_pRecordSet->Close();  
  39.         m_pRecordSet.Release();  
  40.         e.ErrorMessage();  
  41.         return FALSE;  
  42.     }  
  43.     m_pRecordSet->Update();  
  44.     m_pRecordSet->Close();  
  45.     m_pRecordSet.Release();  
  46.     m_pRecordSet = NULL;  
  47.     return TRUE;  
  48. }  

9. 更新数据库中的数据

[cpp] view plain copy print?
  1. BOOL CDataOperator::Update_For_User(OBJ_USER &objUser)  
  2. {  
  3.     if (NULL == m_pConnection)  
  4.         return FALSE;  
  5.     //记录集对象  
  6.     _RecordsetPtr m_pRecordSet;  
  7.     HRESULT hr = m_pRecordSet.CreateInstance(_T("ADODB.Recordset"));  
  8.     if (FAILED(hr))  
  9.     {  
  10.         return FALSE;  
  11.     }  
  12.     CString strSQL;  
  13.     strSQL.Format(_T("select User_ID, User_Name from user where User_ID=%d"), objUser.User_ID);  
  14.     hr = m_pRecordSet->Open(_bstr_t(strSQL), m_pConnection.GetInterfacePtr(),  
  15.         adOpenStatic, adLockOptimistic, adCmdText);  
  16.     if (FAILED(hr))  
  17.     {  
  18.         m_pRecordSet.Release();  
  19.         return FALSE;  
  20.     }  
  21.     try  
  22.     {  
  23.         m_pRecordSet->PutCollect(_T("User_Name"), _variant_t(objUser.User_Name));  
  24.     }  
  25.     catch (_com_error &e)  
  26.     {  
  27.         m_pRecordSet->Close();  
  28.         m_pRecordSet.Release();  
  29.         e.ErrorMessage();  
  30.         return FALSE;  
  31.     }  
  32.     m_pRecordSet->Update();  
  33.     m_pRecordSet->Close();  
  34.     m_pRecordSet.Release();  
  35.     m_pRecordSet = NULL;  
  36.     return TRUE;  
  37. }  


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

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

原创粉丝点击