vs2005c++下使用部分activex控件概述及问题1

最近接到工作需要使用c++,无奈下又得回头看看c++的东西。

c++中连接数据库原提供oledb和dao两种方式,dao还没有接触。后来多了个ado,不过每个操作的表要建一个类,平时用ado.net习惯了刹感麻烦。看到activex中提供了ADODC控件和DataGrid控件,感觉还不错,在网上搜了一圈,总结总结

这是网上一高人写的

 

Step 1 ,新建一个VC++项目,MFC  对话框应用程序,这个过程不再介绍

Step 2,从资源视图中打开主对话框

Step 3,右击工具箱中的“对话框编辑器”,选择“添加-移除项”,在弹出的“自定义工具箱”中选择“COM组件”,添加“Microsoft ADO Data Control 6.0(SP4) (OLEDB)”和“Microsoft DataGrid Control 6.0(SP5)(OLEDB)”两个ActiveX控件,点“确定”就可以了。
            这时候“对话框编辑器”就多出了这两个控件,把它们拖到对话框中去。
            说明:1:如果COM组件中没有这两个控件,请单击“开始”->“所有程序”->“Microsoft 
                             Visual Studio.NET  2003”->         “Visual Studio .NET 工具”-> “Visual Studio.NET 2003 命
                              令提示”
                             输入:regsvr32 msadodc.ocx和regsvr32 msdatgrd.ocx,即可以将这两个控件添加到工具箱中
                         2:如果拖这两个控件时出现“未能实例化控件******,因为这需要设计时授权”,请拿
                              出VS.NET 2003的安装盘,在 /VisualStudio2003Inst/Extras/VB6 Controls目录下应该能找到
                               vb6controls.reg这个文件,双击它,把这个信息         添加到注册表中去,就可以了
Step 4     实现数据库绑定
                        在ADODC控件的属性中找到ConnectionString一项,打开,选择"General“->”Build“,在
              “提供程序”中选择“Microsoft Jet 4.0 OLE DB Provider”(因为我这里用的是Access 2003 数据
               库),在“连接”中选择一个“源数据库”,其他的都用默认值,就可以了。设定完连接字符
              串后打 开“RecordSource”属性,在“CommandType”中选择"1-adCmdText”,在Command Text
             (SQL)中输和"Select * from UserInfo”(视数据表不同而不同),点“确定”。
                        在DataGrid控件的属性中找到Data Source一项,选择“IDC_ADODC1”一项,设DataField为
             “ID”,就可以了
                      好,现在编译一下,可以看到了吧,DataGrid清清楚楚地显示了数据表里的内容。
                      体验到了MFC的强大了吧,哈,不需要自己写一行代码,就能实现这么强大的功能。

Step 5    引用ADODC和DataGrid类
            这一步就比较容易了
            添加两个变量,m_Adodc和m_DataGrid
            就会自己包含这两个类的头文件

Step 6    实现搜索、插入、删除、修改功能
            这一步也很容易做
            我只把Button的Click事件代码贴上
            详细内容就不表述了
            搜索:
            void CVCMFCDBDlg::OnBnClickedButtonSearch()
          {
         // TODO: 在此添加控件通知处理程序代码
         UpdateData(true);
         CString sql= (CString)"select * from UserInfo where ID='";
         sql = sql + (CString)m_csID ;
         sql = sql + (CString)"'";
         m_Adodc.CommandTypeEnum = CAdodc1::adCmdText;
         m_Adodc.put_RecordSource(sql);
         m_Adodc.Refresh();
         m_DataGrid.Refresh();
        UpdateData(false);
        }

        添加:
        void CVCMFCDBDlg::OnBnClickedButtonAddstudy()
        {
         // TODO: 在此添加控件通知处理程序代码
         UpdateData(true);
         CString sql= (CString)"Insert into StudyInfo(UserID,StudyTime,StudyContent,StudyGrade) Values('";
         sql = sql + (CString)m_csAddID;
         sql = sql + (CString)"','";
         sql = sql + (CString)m_csNewTime;
         sql = sql + (CString)"','";
         sql = sql + (CString)m_csNewContent;
         sql = sql + (CString)"',";
         sql = sql + (CString)m_csNewScore;
         sql = sql + (CString)")";
         m_Adodc.CommandTypeEnum = CAdodc1::adCmdText;
         m_Adodc.ConnectStringTypeEnum = CAdodc1::adConnectTypeOledb;
         m_Adodc.put_RecordSource(sql);
         m_Adodc.Refresh();
         m_DataGrid.Refresh();

       }
       
        删除:
        void CVCMFCDBDlg::OnBnClickedButtonDelstudy()
        {
         // TODO: 在此添加控件通知处理程序代码
 
         UpdateData(true);
         CString sqlconn,sql;
         sql= (CString)"delete from StudyInfo where StudyID =";
         sql = sql + (CString)m_csDelID;
         //sql = sql + (CString)"'";
         //m_Adodc.put_ConnectionString(sqlconn);
         //m_Adodc.CommandTypeEnum = CAdodc1::adCmdText;
         m_Adodc.put_RecordSource(sql);
         m_Adodc.Refresh();
         UpdateData(false);
        }

        修改功能类似

Step 7   本DBMS的一些不足

        虽然好像已经实现了该实现的功能
        不过这个小DBMS仍然是有问题的
        问题1:调试结束的候会出现“VCMFCDB.exe 中的 0x77f33847 处未处理的异常: 用户断点 。”
                       不过在生成的.exe文件中不会有此错误
        问题2:添加和删除记录时会出现是“对象关闭时,不允许操作”,但仍可以正常改变数据库中的
                      记录
        这两个问题一直没能得到解决
         还希望知道的朋友能帮助我,不胜感激!

注意的是在vc6.0下使用ADODC控件和DataGrid控件可以在界面上直接配置其属性,运行和调试都不会出错。但在vs2005下事情不再顺利,会报出堆释放出错的问题。解决的方式就是在代码中配置控件的属性。事例如下:

m_adodc.put_ConnectStringType(1);

m_adodc.put_ConnectionString(_T("Provider=SQLOLEDB.1;Password=;Persist Security Info=True;User ID=sa;Initial Catalog=FRS;Data Source=dataserver"));

m_adodc.put_CommandType(1);
 m_adodc.put_RecordSource(_T("SELECT * FROM TEST")); 
 m_adodc.Refresh();
 m_datagrid.putref_DataSource((LPUNKNOWN)m_adodc.get_Recordset());
 m_datagrid.Refresh();

不过问题还是存在的:

当数据库操作语句包含insert,delete,update时(存储过程中含有),会报object is not opened错误,但是数据库操作可以正常执行。希望有遇到这个问题的朋友帮助下!!!

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭