| 
 
 
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;//记录集对象的指针并在构造函数中初始化,在析构函数中删除 复制代码CGkbc8View::CGkbc8View()
{
        m_Set=NULL;
        m_List=&GetListCtrl();//获取列表视图控件
        m_dwDefaultStyle|=LVS_REPORT;//以报表的格式显示
}
CGkbc8View::~CGkbc8View()
{
        if(m_Set!=NULL)
                delete m_Set;
}
5.在视窗中化函数OnInitialUpdate()中注册数据源,并连接记录集显示数据 复制代码void CGkbc8View::OnInitialUpdate()
{
        CListView::OnInitialUpdate();
        if(m_Set==NULL)
        {
        if(!SQLConfigDataSource(NULL, //父窗口指针;
                                        ODBC_ADD_DSN,  //添加的数据源的类型;
                                                        "Microsoft Access Driver (*.mdb)",//驱动程序名;
                                                        //属性:
                            "DSN=Students\0"  //数据源名
                            "Description=工控编程吧测试用\0"    //数据源的说明
                            "FileType=Microsoft Access\0"    //数据源文件类型
                                                        "DBQ=E:\\每日任务\\STUDENTSINFO.MDB\0"//数据库文件全路径名
                    //在根据现有数据设置列的数据类型时所要扫描的行数。 可以为 1 到 16,
                                         //默认值为 8;如果设置为 0,将扫描        所有行。(如果数字超出界限,会返回一个错误)        
                                                "MaxScanRows=0\0")
                  )
                {
                        AfxMessageBox("创建数据源失败!!");
                        return;
                }
                m_Set=new CRecordset(&m_DB);
                if(!m_DB.OpenEx(_T("DSN=Students"),0))
                {
                        AfxMessageBox("打开数据源失败!!");
                        return;
                }
                m_Set->Open(CRecordset::dynaset,_T("Select * from Basic"));
        }
        int i=0,j=0;
        CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
        LV_COLUMN LvColumn;//存储列信息的结构体
        LvColumn.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
        //读取记录集的字段信息
        int nDBFields=m_Set->GetODBCFieldCount();
        for(i=0;i<nDBFields;i++)
        {
                m_Set->GetODBCFieldInfo(i,DbFi);
                LvColumn.iSubItem=i;
复制代码LvColumn.fmt=LVCFMT_CENTER;
                LvColumn.cx=DbFi.m_strName.GetLength()*10+20;
                LvColumn.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
                GetListCtrl().InsertColumn(i,&LvColumn);
        }
        //根据记录集的数据信息添加行
        LV_ITEM LvItem;//条目结构体对象
        CString string;//字符串临时变量
        CDBVariant DbVariant;
        i=0;
        if(m_Set->IsEOF())//记录集是否为空
        {
                AfxMessageBox("记录集没有记录");
                return;
        }
        m_Set->MoveFirst();//从第一个记录开始
        while(m_Set->IsEOF()==0)//是否到达最后一个记录
        {
                LvItem.mask=LVIF_TEXT;
                LvItem.iItem=i;
                LvItem.iSubItem=0;
                m_Set->GetFieldValue((short)0,string);
                LvItem.pszText=string.GetBuffer(string.GetLength());
                m_List->InsertItem(&LvItem);//插入条目
                //显示列数据
                for(j=1;j<nDBFields;j++)
                {
                        m_Set->GetFieldValue((short)j,string);
                        m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
                }
                m_Set->MoveNext();//下移记录
                i++;
        }
}
6.添加菜单项<删除学生编号>关联函数,实现执行SQL语句功能 复制代码void CGkbc8View::OnDelete() 
{
        BOOL bDelete;
        CString sDelStuIDC;
        CString sDelStuIDB;
        CDeleteDlg   DelDlg;
        if(DelDlg.DoModal()==IDOK)
        {        
复制代码 m_List->SetRedraw(FALSE);
                m_List->DeleteAllItems();
                CHeaderCtrl* pHeader = (CHeaderCtrl*) m_List->GetDlgItem(0);
                int nColCount = pHeader->GetItemCount();
                for(int k=nColCount-1;k>=0;k--)
                {
                        int re=m_List->DeleteColumn(k);
                }
                if(m_Set->IsOpen())
                {
                        m_Set->Close();
                }
                
                if(DelDlg.m_DelID=="1"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=1;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=1;";
                        bDelete=TRUE;
                }
        if(DelDlg.m_DelID=="2"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=2;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=2;";
                        bDelete=TRUE;
                }
        if(DelDlg.m_DelID=="3"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=3;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=3;";
                        bDelete=TRUE;
                }
        if(DelDlg.m_DelID=="4"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=4;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=4;";
                        bDelete=TRUE;
                }
        if(DelDlg.m_DelID=="5"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=5;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=5;";
                        bDelete=TRUE;
                }
        if(DelDlg.m_DelID=="6"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=6;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=6;";
                        bDelete=TRUE;
                }
复制代码 if(DelDlg.m_DelID=="7"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=7;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=7;";
                        bDelete=TRUE;
                }
        if(DelDlg.m_DelID=="8"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=8;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=8;";
                        bDelete=TRUE;
                }
                
                if(bDelete){
                        m_Set->m_pDatabase->ExecuteSQL(sDelStuIDB);
                        m_Set->m_pDatabase->ExecuteSQL(sDelStuIDC);
                }
                else{
                        AfxMessageBox("选择的学生的学号不正确!!");
                        return;
                }
                CString m_Select;
        m_Select="SELECT * FROM Basic;";
                if(!m_Set->IsOpen())
                {
                        m_Set->Open(CRecordset::dynaset,m_Select);
                }
                int j=0;
                CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
                LV_COLUMN m_Lc;//存储列信息的结构体
                m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
                //读取记录集的字段信息
                int nDBFields=m_Set->GetODBCFieldCount();
                for(int i=0;i<nDBFields;i++)
                {
                        m_Set->GetODBCFieldInfo(i,DbFi);
                        m_Lc.iSubItem=i;
                        m_Lc.fmt=LVCFMT_CENTER;
                        m_Lc.cx=DbFi.m_strName.GetLength()*10+20;
                        m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
                        GetListCtrl().InsertColumn(i,&m_Lc);
                }
                //根据记录集的数据信息添加行
                LV_ITEM m_item;//条目结构体对象
                CString string;//字符串临时变量
                
复制代码 if(DelDlg.m_DelID=="7"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=7;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=7;";
                        bDelete=TRUE;
                }
        if(DelDlg.m_DelID=="8"){
            sDelStuIDB="DELETE FROM Basic WHERE Basic.StuID=8;";
            sDelStuIDC="DELETE FROM Course WHERE Course.StuID=8;";
                        bDelete=TRUE;
                }
                
                if(bDelete){
                        m_Set->m_pDatabase->ExecuteSQL(sDelStuIDB);
                        m_Set->m_pDatabase->ExecuteSQL(sDelStuIDC);
                }
                else{
                        AfxMessageBox("选择的学生的学号不正确!!");
                        return;
                }
                CString m_Select;
        m_Select="SELECT * FROM Basic;";
                if(!m_Set->IsOpen())
                {
                        m_Set->Open(CRecordset::dynaset,m_Select);
                }
                int j=0;
                CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
                LV_COLUMN m_Lc;//存储列信息的结构体
                m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
                //读取记录集的字段信息
                int nDBFields=m_Set->GetODBCFieldCount();
                for(int i=0;i<nDBFields;i++)
                {
                        m_Set->GetODBCFieldInfo(i,DbFi);
                        m_Lc.iSubItem=i;
                        m_Lc.fmt=LVCFMT_CENTER;
                        m_Lc.cx=DbFi.m_strName.GetLength()*10+20;
                        m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
                        GetListCtrl().InsertColumn(i,&m_Lc);
                }
                //根据记录集的数据信息添加行
                LV_ITEM m_item;//条目结构体对象
                CString string;//字符串临时变量
                
复制代码CDBVariant DbVariant;
                i=0;
                if(m_Set->IsEOF())//记录集是否为空
                {
                        AfxMessageBox("记录集没有记录");
                        return;
                }
                m_Set->MoveFirst();//从第一个记录开始
                while(m_Set->IsEOF()==0)//是否到达最后一个记录
                {
                        m_item.mask=LVIF_TEXT;
                        m_item.iItem=i;
                        m_item.iSubItem=0;
                        m_Set->GetFieldValue((short)0,string);
                        m_item.pszText=string.GetBuffer(string.GetLength());
                        m_List->InsertItem(&m_item);//插入条目
                        //显示列数据
                        for(j=1;j<nDBFields;j++)
                        {
                                m_Set->GetFieldValue((short)j,string);
                                m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
                        }
                        m_Set->MoveNext();//下移记录
                        i++;        
                        m_List->SetRedraw();
                        m_List->Invalidate();
                }
        }        
}
我们来演示功能实现的整个过程   
 |