QQ登录

只需一步,快速开始

270上位机VC MFC使用ODBC删除多记录集数据

[ 复制链接 ]


270上位机VC MFC使用ODBC删除多记录集数据

270上位机VC MFC使用ODBC删除多记录集数据


功能展示

数据源有多个数据表,多张表都会有相同的数据,如两张表都有学号为1的学生信息,要想一次性删除不同表中有关学号为1的学生信息,就不能用前面介绍的方法,我们当前例程演示删除两数据表中相同编号的的学生信息,效果如图,点击删除学生编号菜单,会弹出对话框,选择要删除的编号点击删除即可;
要点提示
1.执行Cdatabase的ExecuteSQL函数时,记得先关闭记录集再调用函数执行,最后再打开记录集,并且在打开时注意参数的设置;
实现功能
1.新建一视窗派生于CListView的单文档的应用程序;
2.再依照例程界面创建一对话框资源,关联类CDeleteDlg,再给组合框关联变量Cstring m_DelID,组合框属性中添加几行数字用作测试用
3.在视窗类中包含三头文件#include<afxdb.h>#include<ODBCINST.H>#include"DeleteDlg.h"
4.在视窗类中添加三成员变量public:public:
  CDatabase    m_DB;
  CListCtrl*   m_List;//列表视图控件的指针

  CRecordset*  m_Set;//记录集对象的指针并在构造函数中初始化,在析构函数中删除
  1. CGkbc8View::CGkbc8View()
  2. {
  3.         m_Set=NULL;
  4.         m_List=&GetListCtrl();//获取列表视图控件
  5.         m_dwDefaultStyle|=LVS_REPORT;//以报表的格式显示
  6. }
  7. CGkbc8View::~CGkbc8View()
  8. {
  9.         if(m_Set!=NULL)
  10.                 delete m_Set;
  11. }
复制代码
5.在视窗中化函数OnInitialUpdate()中注册数据源,并连接记录集显示数据
  1. void CGkbc8View::OnInitialUpdate()
  2. {
  3.         CListView::OnInitialUpdate();
  4.         if(m_Set==NULL)
  5.         {
  6.         if(!SQLConfigDataSource(NULL, //父窗口指针;
  7.                                         ODBC_ADD_DSN,  //添加的数据源的类型;
  8.                                                         "Microsoft Access Driver (*.mdb)",//驱动程序名;
  9.                                                         //属性:
  10.                             "DSN=Students\0"  //数据源名
  11.                             "Description=工控编程吧测试用\0"    //数据源的说明
  12.                             "FileType=Microsoft Access\0"    //数据源文件类型
  13.                                                         "DBQ=E:\\每日任务\\STUDENTSINFO.MDB\0"//数据库文件全路径名
  14.                     //在根据现有数据设置列的数据类型时所要扫描的行数。 可以为 1 到 16,
  15.                                          //默认值为 8;如果设置为 0,将扫描        所有行。(如果数字超出界限,会返回一个错误)        
  16.                                                 "MaxScanRows=0\0")
  17.                   )
  18.                 {
  19.                         AfxMessageBox("创建数据源失败!!");
  20.                         return;
  21.                 }
  22.                 m_Set=new CRecordset(&m_DB);
  23.                 if(!m_DB.OpenEx(_T("DSN=Students"),0))
  24.                 {
  25.                         AfxMessageBox("打开数据源失败!!");
  26.                         return;
  27.                 }
  28.                 m_Set->Open(CRecordset::dynaset,_T("Select * from Basic"));
  29.         }

  30.         int i=0,j=0;
  31.         CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
  32.         LV_COLUMN LvColumn;//存储列信息的结构体
  33.         LvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
  34.         //读取记录集的字段信息
  35.         int nDBFields=m_Set->GetODBCFieldCount();
  36.         for(i=0;i<nDBFields;i++)
  37.         {
  38.                 m_Set->GetODBCFieldInfo(i,DbFi);
  39.                 LvColumn.iSubItem=i;
复制代码
  1. LvColumn.fmt=LVCFMT_CENTER;
  2.                 LvColumn.cx=DbFi.m_strName.GetLength()*10+20;
  3.                 LvColumn.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
  4.                 GetListCtrl().InsertColumn(i,&LvColumn);
  5.         }
  6.         //根据记录集的数据信息添加行
  7.         LV_ITEM LvItem;//条目结构体对象
  8.         CString string;//字符串临时变量
  9.         CDBVariant DbVariant;
  10.         i=0;
  11.         if(m_Set->IsEOF())//记录集是否为空
  12.         {
  13.                 AfxMessageBox("记录集没有记录");
  14.                 return;
  15.         }
  16.         m_Set->MoveFirst();//从第一个记录开始
  17.         while(m_Set->IsEOF()==0)//是否到达最后一个记录
  18.         {
  19.                 LvItem.mask=LVIF_TEXT;
  20.                 LvItem.iItem=i;
  21.                 LvItem.iSubItem=0;
  22.                 m_Set->GetFieldValue((short)0,string);
  23.                 LvItem.pszText=string.GetBuffer(string.GetLength());
  24.                 m_List->InsertItem(&LvItem);//插入条目
  25.                 //显示列数据
  26.                 for(j=1;j<nDBFields;j++)
  27.                 {
  28.                         m_Set->GetFieldValue((short)j,string);
  29.                         m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
  30.                 }
  31.                 m_Set->MoveNext();//下移记录
  32.                 i++;
  33.         }
  34. }
复制代码
6.添加菜单项<删除学生编号>关联函数,实现执行SQL语句功能
  1. void CGkbc8View::OnDelete()
  2. {
  3.         BOOL bDelete;
  4.         CString sDelStuIDC;
  5.         CString sDelStuIDB;
  6.         CDeleteDlg   DelDlg;
  7.         if(DelDlg.DoModal()==IDOK)
  8.         {        
复制代码
  1. m_List->SetRedraw(FALSE);
  2.                 m_List->DeleteAllItems();
  3.                 CHeaderCtrl* pHeader = (CHeaderCtrl*) m_List->GetDlgItem(0);
  4.                 int nColCount = pHeader->GetItemCount();
  5.                 for(int k=nColCount-1;k>=0;k--)
  6.                 {
  7.                         int re=m_List->DeleteColumn(k);
  8.                 }
  9.                 if(m_Set->IsOpen())
  10.                 {
  11.                         m_Set->Close();
  12.                 }
  13.                
  14.                 if(DelDlg.m_DelID=="1"){
  15.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=1;";
  16.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=1;";
  17.                         bDelete=TRUE;
  18.                 }
  19.         if(DelDlg.m_DelID=="2"){
  20.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=2;";
  21.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=2;";
  22.                         bDelete=TRUE;
  23.                 }
  24.         if(DelDlg.m_DelID=="3"){
  25.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=3;";
  26.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=3;";
  27.                         bDelete=TRUE;
  28.                 }
  29.         if(DelDlg.m_DelID=="4"){
  30.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=4;";
  31.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=4;";
  32.                         bDelete=TRUE;
  33.                 }
  34.         if(DelDlg.m_DelID=="5"){
  35.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=5;";
  36.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=5;";
  37.                         bDelete=TRUE;
  38.                 }
  39.         if(DelDlg.m_DelID=="6"){
  40.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=6;";
  41.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=6;";
  42.                         bDelete=TRUE;
  43.                 }
复制代码
  1. if(DelDlg.m_DelID=="7"){
  2.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=7;";
  3.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=7;";
  4.                         bDelete=TRUE;
  5.                 }
  6.         if(DelDlg.m_DelID=="8"){
  7.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=8;";
  8.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=8;";
  9.                         bDelete=TRUE;
  10.                 }
  11.                
  12.                 if(bDelete){
  13.                         m_Set->m_pDatabase->ExecuteSQL(sDelStuIDB);
  14.                         m_Set->m_pDatabase->ExecuteSQL(sDelStuIDC);
  15.                 }
  16.                 else{
  17.                         AfxMessageBox("选择的学生的学号不正确!!");
  18.                         return;
  19.                 }
  20.                 CString m_Select;
  21.         m_Select="SELECT * FROM Basic;";
  22.                 if(!m_Set->IsOpen())
  23.                 {
  24.                         m_Set->Open(CRecordset::dynaset,m_Select);
  25.                 }
  26.                 int j=0;
  27.                 CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
  28.                 LV_COLUMN m_Lc;//存储列信息的结构体
  29.                 m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
  30.                 //读取记录集的字段信息
  31.                 int nDBFields=m_Set->GetODBCFieldCount();
  32.                 for(int i=0;i<nDBFields;i++)
  33.                 {
  34.                         m_Set->GetODBCFieldInfo(i,DbFi);
  35.                         m_Lc.iSubItem=i;
  36.                         m_Lc.fmt=LVCFMT_CENTER;
  37.                         m_Lc.cx=DbFi.m_strName.GetLength()*10+20;
  38.                         m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
  39.                         GetListCtrl().InsertColumn(i,&m_Lc);
  40.                 }
  41.                 //根据记录集的数据信息添加行
  42.                 LV_ITEM m_item;//条目结构体对象
  43.                 CString string;//字符串临时变量
  44.                
复制代码
  1. if(DelDlg.m_DelID=="7"){
  2.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=7;";
  3.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=7;";
  4.                         bDelete=TRUE;
  5.                 }
  6.         if(DelDlg.m_DelID=="8"){
  7.             sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=8;";
  8.             sDelStuIDC="DELETE FROM Course WHERE Course.StuID=8;";
  9.                         bDelete=TRUE;
  10.                 }
  11.                
  12.                 if(bDelete){
  13.                         m_Set->m_pDatabase->ExecuteSQL(sDelStuIDB);
  14.                         m_Set->m_pDatabase->ExecuteSQL(sDelStuIDC);
  15.                 }
  16.                 else{
  17.                         AfxMessageBox("选择的学生的学号不正确!!");
  18.                         return;
  19.                 }
  20.                 CString m_Select;
  21.         m_Select="SELECT * FROM Basic;";
  22.                 if(!m_Set->IsOpen())
  23.                 {
  24.                         m_Set->Open(CRecordset::dynaset,m_Select);
  25.                 }
  26.                 int j=0;
  27.                 CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
  28.                 LV_COLUMN m_Lc;//存储列信息的结构体
  29.                 m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
  30.                 //读取记录集的字段信息
  31.                 int nDBFields=m_Set->GetODBCFieldCount();
  32.                 for(int i=0;i<nDBFields;i++)
  33.                 {
  34.                         m_Set->GetODBCFieldInfo(i,DbFi);
  35.                         m_Lc.iSubItem=i;
  36.                         m_Lc.fmt=LVCFMT_CENTER;
  37.                         m_Lc.cx=DbFi.m_strName.GetLength()*10+20;
  38.                         m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
  39.                         GetListCtrl().InsertColumn(i,&m_Lc);
  40.                 }
  41.                 //根据记录集的数据信息添加行
  42.                 LV_ITEM m_item;//条目结构体对象
  43.                 CString string;//字符串临时变量
  44.                
复制代码
  1. CDBVariant DbVariant;
  2.                 i=0;
  3.                 if(m_Set->IsEOF())//记录集是否为空
  4.                 {
  5.                         AfxMessageBox("记录集没有记录");
  6.                         return;
  7.                 }
  8.                 m_Set->MoveFirst();//从第一个记录开始
  9.                 while(m_Set->IsEOF()==0)//是否到达最后一个记录
  10.                 {
  11.                         m_item.mask=LVIF_TEXT;
  12.                         m_item.iItem=i;
  13.                         m_item.iSubItem=0;
  14.                         m_Set->GetFieldValue((short)0,string);
  15.                         m_item.pszText=string.GetBuffer(string.GetLength());
  16.                         m_List->InsertItem(&m_item);//插入条目
  17.                         //显示列数据
  18.                         for(j=1;j<nDBFields;j++)
  19.                         {
  20.                                 m_Set->GetFieldValue((short)j,string);
  21.                                 m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
  22.                         }
  23.                         m_Set->MoveNext();//下移记录
  24.                         i++;        
  25.                         m_List->SetRedraw();
  26.                         m_List->Invalidate();
  27.                 }
  28.         }        
  29. }
复制代码
我们来演示功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:270.上位机VC MFC使用ODBC删除多记录集数据.zip 
文件大小:47.79 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索