开发者社区> 范大脚脚> 正文

MFC通过ODBC连接Mysql程序

简介:
+关注继续查看

经过这个礼拜的折腾,先是安装Mysql,学习下Mysql基本语句操作,学习下MFC操作,通过ODBC连接Mysql,参考各种网上的实例程序,

加上自己的不断调试,修改,终于将这一可对数据库进行基本操作的程序写完(由于还是新手,,其中肯定有很多不完善的地方,

希望各位高手帮忙指出。)

下面记录下程序:

安装建立mysql,连接ODBC以及通过MFC拖控件这些过程网上很多,就不写了,说一下我的mysql中有database mytest 内有表格mytable,如下:

1、先通过vs2005建立一个MFC工程,vs自动生成文件如图:

2、打开stdafx.h头文件,添加如下语句

#include <odbcinst.h> 
#include "afxdb.h"

这两个头文件应该是定义了后面用到的数据库操作类CDataBase、CRecodSet .etc的。

3、剩下的基本都是在ODBCTestDlg.cpp文件操作

  打开数据库进行数据显示:

  在OnInitDialog函数中添加如下语句

  

复制代码
View Code
1 m_list.InsertColumn(1, _T("Name"), LVCFMT_LEFT,80);//在Listctrl控件上添加列,与数据库table对应。
2 m_list.InsertColumn(2, _T("Sex"), LVCFMT_LEFT,80);
3 m_list.InsertColumn(3, _T("Grade"), LVCFMT_LEFT,80);
4 CString cmdStr = _T("SELECT * FROM mytable order by Name Desc");
5 m_show(cmdStr);
复制代码

 

1
m_show()函数中的内容完全可以全部放在OnInitDialog()中,但考虑到后面操作数据库时,每次都要写同样的操作,故将其写一函数中
复制代码
View Code
复制代码
 1 // get data from database and show them in list control
2 void CODBCTestDlg::m_show(CString cmdStr)
3 {
4 m_list.DeleteAllItems();
5 CDatabase db;
6 db.Open(NULL,FALSE,FALSE,L"ODBC;DSN=mydb;UID=root;PWD=123456");
7 CRecordset rs( &db );
8 rs.Open( CRecordset::forwardOnly, (L"%s", cmdStr));
9 //short nFields = rs.GetODBCFieldCount();
10 while(!rs.IsEOF())
11 {
12
13 CString varName;
14 rs.GetFieldValue(L"Name", varName);
15 m_list.InsertItem(0, varName);
16 CString varSex;
17 rs.GetFieldValue(L"Sex", varSex);
18 m_list.SetItemText(0, 1, varSex);
19 CString varGrade;
20 rs.GetFieldValue(L"Grade", varGrade);
21 m_list.SetItemText(0, 2, varGrade);
22 rs.MoveNext();
23 }
24 m_list.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // | LVS_SINGLESEL);
25 rs.Close();
26 db.Close();
27 }
复制代码
复制代码



1
这样已经可以在ListCtrl中显示数据库中得内容了。

4、操作数据库

  a、点击ListCtrl在Edit control中显示对应内容,为ListCtrl添加响应函数

  

复制代码
View Code
复制代码
 1 void CODBCTestDlg::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
2 {
3 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
4 // TODO: Add your control notification handler code here
5
6 #if 0
7 LPNMITEMACTIVATE lpNMItemActivate = (LPNMITEMACTIVATE)pNMHDR;
8 if (lpNMItemActivate != NULL)
9 {
10 nItem = lpNMItemActivate->iItem;
11 }
12 LV_ITEM lvitem = {0};
13 lvitem.iItem =nItem;
14 lvitem.iSubItem = 0;
15 lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
16 m_list.GetItem(&lvitem);
17 m_control_edit_name.SetWindowText(lvitem.pszText);
18 #endif
19 int nIndex;
20 CString name, sex, grade;
21 //nIndex = m_list.GetSelectionMark();
22 nIndex = m_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
23 if(-1 == nIndex)
24 nIndex = 0;
25 name = m_list.GetItemText(nIndex, 0);
26 sex = m_list.GetItemText(nIndex, 1);
27 grade = m_list.GetItemText(nIndex, 2);
28 m_control_edit_name.SetWindowText(name);
29 m_control_edit_sex.SetWindowText(sex);
30 m_control_edit_grade.SetWindowText(grade);
31
32 *pResult = 0;
33 }
复制代码
复制代码

  b、在mysql 中add数据函数

  

复制代码
View Code
复制代码
 1 void CODBCTestDlg::OnBnClickedAdd()
2 {
3 // TODO: Add your control notification handler code here
4 CDatabase db;
5 db.Open(NULL, FALSE, FALSE, _T("ODBC;DSN=mydb;UID=root;PWD=123456"));
6 CString str, Name, Sex, Grade;
7 m_control_edit_name.GetWindowText(Name);
8 m_control_edit_sex.GetWindowText(Sex);
9 m_control_edit_grade.GetWindowText(Grade);
10 //str = L"insert into mytable values('" + Name +L"','" + Sex +L"','" + Grade + L"')";
11 str.Format(L"insert into mytable values('%s','%s','%s')", Name, Sex, Grade);
12 db.ExecuteSQL(str);
13 db.Close();
14 CString cmdStr = _T("SELECT * FROM mytable order by name Desc");
15 m_show(cmdStr);
16 }
复制代码
复制代码

  c、在mysql中alter数据函数

复制代码
View Code
复制代码
 1 void CODBCTestDlg::OnBnClickedAlter()
2 {
3 // TODO: 在此添加控件通知处理程序代码
4 int nIndex;
5 CString name, sex, grade, newName, newSex, newGrade;
6 CString dataToAlter;
7 CDatabase db;
8 db.Open(NULL, FALSE, FALSE, _T("ODBC;DSN=mydb;UID=root;PWD="));
9 nIndex = m_list.GetSelectionMark();
10 if(-1 == nIndex)
11 {
12 AfxMessageBox(L"select a row data!");
13 }
14 else
15 {
16 name = m_list.GetItemText(nIndex, 0);
17 sex = m_list.GetItemText(nIndex, 1);
18 grade = m_list.GetItemText(nIndex, 2);
19 }
20 m_control_edit_name.GetWindowText(newName);
21 m_control_edit_sex.GetWindowText(newSex);
22 m_control_edit_grade.GetWindowText(newGrade);
23 if(newName.IsEmpty() || newSex.IsEmpty() || newGrade.IsEmpty())
24 {
25 AfxMessageBox(L"Name,Sex,Grade all cannot be empty");
26 }
27 dataToAlter.Format(L"update mytable set Name='%s', Sex='%s', Grade='%s'\
28 where Name='%s' and Sex='%s' and Grade='%s'",\
29 newName, newSex, newGrade, name, sex, grade);
30 db.ExecuteSQL(dataToAlter);
31 db.Close();
32 CString cmdStr = _T("select * from mytable order by Name Desc");
33 m_show(cmdStr);
34 }
复制代码
复制代码

  d、在mysql中delete数据函数

复制代码
View Code
复制代码
 1 void CODBCTestDlg::OnBnClickedDelete()
2 {
3 // TODO: Add your control notification handler code here
4 int nIndex;
5 CString name, sex, grade, dataToDel;
6 CDatabase db;
7 db.Open(NULL, FALSE, FALSE, _T("ODBC;DSN=mydb;UID=root;PWD=123456"));
8 nIndex = m_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
9 //if(-1 == nIndex)
10 // nIndex = 0;
11 if(-1 != nIndex)
12 {
13 name = m_list.GetItemText(nIndex, 0);
14 sex = m_list.GetItemText(nIndex, 1);
15 grade = m_list.GetItemText(nIndex, 2);
16 }
17 else
18 {
19 m_control_edit_name.GetWindowText(name);
20 m_control_edit_sex.GetWindowText(sex);
21 m_control_edit_grade.GetWindowText(grade);
22 }
23
24 dataToDel.Format(L"delete from mytable where Name='%s' and Sex='%s'", name, sex);
25 db.ExecuteSQL(dataToDel);
26 db.Close();
27 CString cmdStr = _T("select * from mytable order by Name Desc");
28 m_show(cmdStr);
29
30 }
复制代码
复制代码

  e、在mysql中select数据函数(当时写find的没改)

复制代码
View Code
复制代码
 1 void CODBCTestDlg::OnBnClickedFind()
2 {
3 // TODO: Add your control notification handler code here
4 CDatabase db;
5 db.Open(NULL, FALSE, FALSE, _T("ODBC;DSN=mydb;UID=root;PWD=123456"));
6 CString Name, str;
7 m_control_edit_name.GetWindowText(Name);
8 str.Format(_T("select * from mytable where Name= '%s' Desc"), Name);
9 db.ExecuteSQL(str);
10 db.Close();
11 m_show(str);
12 }
复制代码



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySQL连接错误,使用Navicat连接MySQL出现访问被拒错误的情况:
MySQL连接错误,使用Navicat连接MySQL出现访问被拒错误的情况:
18 0
MySQL连接IDEA详细教程
使用IDEA的时候,需要连接Database,连接时遇到了一些小问题,下面记录一下操作流程以及遇到的问题的解决方法。
31 0
错误代码:2013查询期间丢失与MySQL服务器的连接
错误代码:2013查询期间丢失与MySQL服务器的连接
23 0
【MySQL】(图解)快速理解内连接、外连接、左连接、右连接
【MySQL】(图解)快速理解内连接、外连接、左连接、右连接
12 0
运维 ---Docker部署mysql后使用Navicat尝试连接遇到1251报错问题的解决方法
运维 ---Docker部署mysql后使用Navicat尝试连接遇到1251报错问题的解决方法
28 0
mysql 内连接、左连接(左外连接)、右连接(右外连接)、全连接(全外连接)
mysql 内连接、左连接(左外连接)、右连接(右外连接)、全连接(全外连接)
38 0
如何使用码匠连接 MySQL
目前码匠已经实现了与 MySQL 数据源的连接,支持书写 SQL 语句,也支持通过图形化界面对数据进行增、删、改、查, 同时还支持将数据绑定至各种组件,并通过简单的代码实现数据的可视化和计算等操作,能让您快速、高效地搭建应用和内部系统。
21 0
【Java】Java连接Mysql数据库的demo示例
【Java】Java连接Mysql数据库的demo示例
23 0
Egg 项目怎么连接 MySQL 实现增删改查接口?
Egg 项目怎么连接 MySQL 实现增删改查接口?
20 0
NET连接MySQL数据库的CRUD
NET连接MySQL数据库的CRUD
17 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
让 MySQL 原生分布式触手可及
立即下载
好的 MySQL 兼容可以做到什么程度
立即下载
云数据库RDS MySQL从入门到高阶
立即下载