QQ登录

只需一步,快速开始

272上位机VC MFC使用ODBC执行事务处理

[ 复制链接 ]

272上位机VC MFC使用ODBC执行事务处理

272上位机VC MFC使用ODBC执行事务处理

272上位机VC MFC使用ODBC执行事务处理


功能展示

在很多场合都需要进行事务处理,不然会出现我们不想要的结果,当前例程实现事务处理功能,例程在删除记录时把表Basic设为可删除记录状态,把Course设为不可状态,这样执行删除两表记录时由于删除Course表记录失败而回滚,Basic表中记录也未被删除,效果如图;

要点提示
1.事务处理就是把对数据库一系列的操作都集中到一起执行,如果一个操作不成功,则这一系列的操作都不执行;
2.事务处理一般步骤为:
使用CanTransact()函数查看能否进行事务处理;
使用BeginTransact函数开始事务处理;
使用CommitTransact函数提交事务;
如果失败就捕获错误,用RollBack函数进行事务回滚;

3.注意我们当前例程执行删除操作时是直接执行SQL语句而不是使用m_pSet->Delete(),该函数在某些情况下不能成功回滚事务,因为该函数执行的删除操作不能够被撤销
实现功能
1.新建基于对话框的应用程序;
2.依照例程界面依次添加三静态文本控件ID分别修改为IDC_STATIC_COL1,IDC_STATIC_COL2,IDC_STATIC_COL3,三编辑框控件,ID修改为IDC_EDIT_COL1,IDC_EDIT_COL2,IDC_EDIT_COL3,三按钮控件<打开Course表><打开Basic表><删除记录(测试事务)>
3.在主对话框头文件中添加包含两头文件#include<afxdb.h>
#include<ODBCINST.H> 再添加两成员变量public:CRecordset* m_pSet;//记录集对象的指针
CDatabase    m_DB;并在构造函数中初始化  m_pSet=NULL;析构函数中消除if(m_pSet!=NULL) delete m_pSet;

4.在OnInitDialog()函数中使用我们例程根目录数据库文件注册数据源
  1. if(m_pSet==NULL)
  2.         {
  3.         if(!SQLConfigDataSource(NULL, //父窗口指针;
  4.                         ODBC_ADD_DSN,  //添加的数据源的类型;
  5.                         "Microsoft Access Driver (*.mdb)",//驱动程序名;
  6.                         "DSN=transaction\0"  //数据源名
  7.                         "Description=工控编程吧测试用\0"    //数据源的说明
  8.                         "FileType=Microsoft Access\0"    //数据源文件类型
  9.                         "DBQ=E:\\每日任务\\Transaction.mdb\0"//数据库文件全路径名        
  10.                         "MaxScanRows=0\0")
  11.                         )
  12.                 {
  13.                         AfxMessageBox("创建数据源失败!!");
  14.                         return FALSE;
  15.                 }
复制代码
  1. m_pSet=new CRecordset(&m_DB);
  2.                 if(!m_DB.OpenEx(_T("DSN=transaction"),0))
  3.                 {
  4.                         AfxMessageBox("打开数据源失败!!");
  5.                         return FALSE;
  6.                 }
  7.                 m_pSet->Open(CRecordset::dynaset,_T("Select * from Basic"));
  8.         }
复制代码
5.关联前面添加的三个按钮控件函数
  1. void CGkbc8Dlg::OnOpenCourse()
  2. {
  3.         CWnd *pWnd1=GetDlgItem(IDC_STATIC_COL1);//得到控件句柄
  4.         CWnd *pWnd2=GetDlgItem(IDC_STATIC_COL2);//
  5.         CWnd *pWnd3=GetDlgItem(IDC_STATIC_COL3);//
  6.         pWnd1->SetWindowText("学号");
  7.         pWnd2->SetWindowText("科目");
  8.         pWnd3->SetWindowText("成绩");
  9.         if(m_pSet->IsOpen())
  10.         {
  11.                 m_pSet->Close();
  12.                 m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Course ORDER BY Col1");
  13.                 m_pSet->MoveFirst();
  14.         }
  15.         else
  16.                 m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Course ORDER BY Col1");
  17. //<>
  18.         CString string;
  19.         m_pSet->MoveFirst();//从第一个记录开始
  20.         m_pSet->GetFieldValue((short)0,string);
  21.         SetDlgItemText(IDC_EDIT_COL1,string);
  22.         m_pSet->GetFieldValue((short)1,string);
  23.         SetDlgItemText(IDC_EDIT_COL2,string);
  24.         m_pSet->GetFieldValue((short)2,string);
  25.         SetDlgItemText(IDC_EDIT_COL3,string);
  26. }
  27. void CGkbc8Dlg::OnOpenBasic()
  28. {
  29.         CWnd *pWnd1=GetDlgItem(IDC_STATIC_COL1);//得到控件句柄
  30.         CWnd *pWnd2=GetDlgItem(IDC_STATIC_COL2);//
  31.         CWnd *pWnd3=GetDlgItem(IDC_STATIC_COL3);//
  32.         pWnd1->SetWindowText("学号");
  33.         pWnd2->SetWindowText("籍贯");
复制代码
  1. pWnd3->SetWindowText("电话");
  2.         if(m_pSet->IsOpen())
  3.         {
  4.                 m_pSet->Close();
  5.                 m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Basic ORDER BY Col1");
  6.                 m_pSet->MoveFirst();
  7.         }
  8.         else
  9.                 m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Basic ORDER BY Col1");
  10.         //<>
  11.         CString string;
  12.         m_pSet->MoveFirst();//从第一个记录开始
  13.         m_pSet->GetFieldValue((short)0,string);
  14.         SetDlgItemText(IDC_EDIT_COL1,string);
  15.         m_pSet->GetFieldValue((short)1,string);
  16.         SetDlgItemText(IDC_EDIT_COL2,string);
  17.         m_pSet->GetFieldValue((short)2,string);
  18.         SetDlgItemText(IDC_EDIT_COL3,string);
  19. }
  20. void CGkbc8Dlg::OnRecordDelete()
  21. {
  22.         CString  sDel;
  23. //******************测试能否进行事务处理******************
  24.     if(m_pSet->m_pDatabase->CanTransact())
  25.             m_pSet->m_pDatabase->BeginTrans();
  26.         else
  27.                 return;
  28. //*****************删除Basic表中的指定的记录*************
  29.         TRY
  30.         {
  31.         sDel="DELETE FROM Basic WHERE Basic.Col1=2;";//定义SQL语句
  32.         if(m_pSet->IsOpen())//打开Basic表
  33.                 {
  34.                     m_pSet->Close();
  35.                     m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Basic ORDER BY Col1");
  36.                     m_pSet->MoveFirst();
  37.                 }
  38.             else
  39.                     m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Basic ORDER BY Col1");
  40.                 m_pSet->m_pDatabase->ExecuteSQL(sDel);//执行删除操作
  41. //*****************删除Course表中指定的记录******************
  42.         sDel="DELETE FROM Course WHERE Course.Col1=2;";//定义SQL语句
  43.         
复制代码
  1. if(m_pSet->IsOpen())//打开Course表
  2.                 {
  3.                     m_pSet->Close();
  4.                     m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Course ORDER BY Col1",CRecordset::readOnly);
  5.                     m_pSet->MoveFirst();
  6.                 }
  7.             else
  8.                     m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"SELECT * FROM Course ORDER BY Col1",CRecordset::readOnly);
  9.                 m_pSet->m_pDatabase->ExecuteSQL(sDel);//执行删除操作
  10. //*********************事务结束提交事务*************        
  11.             m_pSet->m_pDatabase->CommitTrans();
  12.         }
  13.         CATCH(CDBException,e)//捕捉错误
  14.         {
  15.                 AfxMessageBox("事务处理失败!!");
  16.                 m_pSet->m_pDatabase->Rollback();//回滚事务        
  17.         }
  18.         END_CATCH
  19. }
复制代码
我们来演示功能实现的整个过程
请点击此处下载

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

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

文件名称:272.上位机VC MFC使用ODBC执行事务处理.zip 
文件大小:31.92 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

如果您认可,可联系功能定制!

  

如果您着急,充值会员可直接联系发您资料!

  

QQ联系我

微信扫扫联系我

  
  

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

  

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

  

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


回复

使用道具 举报

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