visual c++ 2008进行MySQL编程(ODBC) --(二) CDatabase操作数据库

55 篇文章 0 订阅
10 篇文章 0 订阅

本来是想做上下两次说完的,东西太多了,一次写完,我累,看起来也累。

接上一篇文章讲吧,前面说到了具体的Mysql的ODBC驱动配置,链接如下:

visual c++ 2008进行MySQL编程(ODBC) -- 一

数据库可以有两种方式编程,第一种直接使用class CDatabase,然后执行一些没有返回内容的操作,比如增删和修改,查询就做不了啦。

这次就说这个类功能。

首先vc创建一个MFC基于对话框的工程,我们要做上面说的一些操作数据库的编码操作了:

 创建一个纯种的对话框,呵呵:

生成的dialog,我们添加我们要的东西:

 

现在查看一下类视图,可以看到如下:

 

我要做的操作,都是在类Cmy_dbDlg这个里面操作了。

第一件事情就是在这个类定义里面添加一个类成员,私有成员:CDatabase m_db_opr;

[cpp]  view plain copy
  1. private:  
  2.     CDatabase m_db_opr;  


在这个类所在的头文件里面添加文件:

 

[cpp]  view plain copy
  1. #include "afxdb.h"  

 

否在添加的db类,找不到定义的。

找到类Cmy_dbDlg里面定义的函数:

[cpp]  view plain copy
  1. virtual BOOL OnInitDialog();  


我们要在里面添加数据库初始化代码的(函数靠近最后面吧):   

[cpp]  view plain copy
  1. m_db_opr.Open(NULL,   
  2.     false,   
  3.     false,   
  4.     _T("ODBC;server=127.0.0.1;DSN=chh1;UID=zhoutianzuo;PWD=000000")  
  5.     );  
  6.   
  7. if(!m_db_opr.IsOpen())  
  8. {  
  9.     AfxMessageBox(_T("DB open failed!"));  
  10.     return false;  
  11. }  

 

上面的代码解释一下:数据库变量用默认构造函数就行了,所以不用在对话框的类构造函数里面做什么了,然后就是打开数据库,调用db成员的Open函数,示例里面最后一个传入参数,第一个表示ODBC驱动方式,第二个参数,表示本机server,DSN就是前面一讲里面说的数据库名称,后面就是用户名和密码了。

接下来要判断一下数据库是否打开了,不成功,弹出错误窗口,直接报错了。

回到开始拉控件的对话框,我们给编辑控件添加类的私有的成员变量m_cust_id,m_cust_name:


上图是添加cust id,添加cust name一致。

接下来,给addnew这个按钮添加单击事件:

上图中,我们添加消息响应函数为OnBnClickedAddNew,点击Add and Edit按钮。代码如下:

[cpp]  view plain copy
  1. void Cmy_dbDlg::OnBnClickedAddNew()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4. }  

如上,接着添加Edit和Delete的事件。代码如下:

[cpp]  view plain copy
  1. void Cmy_dbDlg::OnBnClickedEdit()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4. }  
  5.   
  6. void Cmy_dbDlg::OnBnClickedDelete()  
  7. {  
  8.     // TODO: Add your control notification handler code here  
  9. }  


最开始已经说了,我们这里只介绍CDatabase类,所以,所有操作都是这个类的,而实现增删和修改的依托就是成员函数:

[cpp]  view plain copy
  1. Call this member function when you need to execute a SQL command directly.  
  2.   
  3.    
  4. void ExecuteSQL(   
  5.    LPCTSTR lpszSQL    
  6. );  
  7.    
  8.   
  9. Parameters  
  10. lpszSQL  
  11. Pointer to a null-terminated string containing a valid SQL command to execute. You can pass a CString.  


上面的介绍来自MSDN文档介绍。

还有一个函数:

[cpp]  view plain copy
  1. Call this member function to determine whether the CDatabase object allows updates.  
  2.   
  3.    
  4. BOOL CanUpdate( ) const;  
  5.    
  6.   
  7. Return Value  
  8. Nonzero if the CDatabase object allows updates;   
[cpp]  view plain copy
  1. otherwise 0, indicating either that you passed TRUE in bReadOnly   
[cpp]  view plain copy
  1. when you opened the CDatabase object or that the data source itself is read-only.   
[cpp]  view plain copy
  1. The data source is read-only if a call to the ODBC API function SQLGetInfo for SQL_DATASOURCE_READ_ONLY returns "y".  

 

这两个函数可以先判断数据库能修改不?如果可以,就执行一个需要的的SQL语句就是了,但是需要注意的就是ExecuteSQL,是会抛出异常的。说到这里,说明一点,如果您老一点不会c++,自然就不知道异常为何物;同样,如果你一点不了解MySql,自然也不会写Sql操作语句了。建议先回去补补,不多,就补补这里就行了。

我们添加一个获取custid的成员函数:

[cpp]  view plain copy
  1. BOOL Cmy_dbDlg::GetCustIdFromEdit(int &out_id)  
  2. {  
  3.     int cust_id;  
  4.     CString str;  
  5.     const wchar_t *c_str;  
  6.       
  7.     if(!m_cust_id.GetWindowTextLengthW())  
  8.     {  
  9.         return false;  
  10.     }  
  11.   
  12.     m_cust_id.GetWindowTextW(str);  
  13.   
  14.     c_str = str.GetString();  
  15.       
  16.     swscanf_s(c_str, _T("%lu"), &cust_id);  
  17.   
  18.     out_id = cust_id;  
  19.   
  20.     return true;  
  21. }  


然后修改AddNew的消息相应函数如下:

[cpp]  view plain copy
  1. void Cmy_dbDlg::OnBnClickedAddNew()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     int cust_id = 0 ;  
  5.     CString cust_name;  
  6.   
  7.     if(!GetCustIdFromEdit(cust_id))  
  8.     {  
  9.         AfxMessageBox(_T("NULL cust id, return"));  
  10.         return;  
  11.     }  
  12.   
  13.     if(!m_cust_name.GetWindowTextLengthW())  
  14.     {  
  15.         AfxMessageBox(_T("NULL cust name, return"));  
  16.         return;  
  17.     }  
  18.   
  19.     m_cust_name.GetWindowTextW(cust_name);  
  20.   
  21.     try  
  22.     {  
  23.         CString sql_str;  
  24.           
  25.         sql_str.Format(_T("insert customer value (%d, '%s')"), cust_id, cust_name);  
  26.   
  27.         m_db_opr.ExecuteSQL(sql_str);  
  28.     }  
  29.     catch(CDBException* pe)  
  30.     {  
  31.         // The error code is in pe->m_nRetCode  
  32.         pe->ReportError();  
  33.         pe->Delete();  
  34.     }  
  35. }  

代码里面最后一段异常捕获代码,会捕获异常的,比如重复插入等。

现在我们尝试插入一个条目:



查看数据库,就发现已经有插入的条目了:

很明显,插入成功了。上面的画蓝色的圈圈就是了。

当我们再次点击AddNew按钮的时候,捕获异常的部分代码就起作用了:

提示索引重复了。

呵呵,就是这么简单了。

接下来我们修改Edit和Delete事件代码,首先是Edit事件的:

[cpp]  view plain copy
  1. void Cmy_dbDlg::OnBnClickedEdit()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.         int cust_id = 0 ;  
  5.     CString cust_name;  
  6.   
  7.     if(!GetCustIdFromEdit(cust_id))  
  8.     {  
  9.         AfxMessageBox(_T("NULL cust id, return"));  
  10.         return;  
  11.     }  
  12.   
  13.     if(!m_cust_name.GetWindowTextLengthW())  
  14.     {  
  15.         AfxMessageBox(_T("NULL cust name, return"));  
  16.         return;  
  17.     }  
  18.   
  19.     m_cust_name.GetWindowTextW(cust_name);  
  20.   
  21.     try  
  22.     {  
  23.         CString sql_str;  
  24.           
  25.         sql_str.Format(_T("update customer set cust_name = '%s' where cust_id = %d"),   
  26.             cust_name,   
  27.             cust_id  
  28.             );  
  29.   
  30.         m_db_opr.ExecuteSQL(sql_str);  
  31.     }  
  32.     catch(CDBException* pe)  
  33.     {  
  34.         // The error code is in pe->m_nRetCode  
  35.         pe->ReportError();  
  36.         pe->Delete();  
  37.     }  
  38. }  


接着是Delete的:

[cpp]  view plain copy
  1. void Cmy_dbDlg::OnBnClickedDelete()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     int cust_id = 0 ;  
  5.     CString cust_name;  
  6.   
  7.     if(!GetCustIdFromEdit(cust_id))  
  8.     {  
  9.         AfxMessageBox(_T("NULL cust id, return"));  
  10.         return;  
  11.     }  
  12.   
  13.     try  
  14.     {  
  15.         CString sql_str;  
  16.           
  17.         sql_str.Format(_T("delete from customer where cust_id = %d"), cust_id);  
  18.   
  19.         m_db_opr.ExecuteSQL(sql_str);  
  20.     }  
  21.     catch(CDBException* pe)  
  22.     {  
  23.         // The error code is in pe->m_nRetCode  
  24.         pe->ReportError();  
  25.         pe->Delete();  
  26.     }  
  27. }  


这一节说说到这里吧,貌似不能上传附件,如果需要的话,可以邮件我。我方便的时候一起给大家哈。

 

如果有下一讲:我会讲顶级牛逼的CRecordset这个类,呵呵,更好的数据库操作方式,更好的查询和遍历方式。

http://blog.csdn.net/ztz0223/article/details/7617425

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值