zoukankan      html  css  js  c++  java
  • MFC通过ODBC连接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 }
     

    到这里这个MFC连接mysql的程序基本完成。

  • 相关阅读:
    SpringCloud--Ribbon--源码解析--Ribbon入口实现
    SpringCloud--Ribbon--使用demo
    装饰着模式(Decorator Pattern)
    SpringCloud--Eureka--配置
    SpringCloud--Eureka--原理及源码解析
    SpringCloud--Eureka--搭建
    观察者模式(Observer Pattern)
    策略模式(Strategy Pattern)
    xeus-clickhouse: Jupyter 的 ClickHouse 内核
    Spring的学习与实战(续)
  • 原文地址:https://www.cnblogs.com/jinjiangongzuoshi/p/3290561.html
Copyright © 2011-2022 走看看