加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Winocc.cpp,line345问题的调试(原创)

(2011-06-05 22:56:54)
标签:

it

分类: VC

       

 

 

这个问题让我头疼了一天,不过功夫不负有心人终于让我给解决了

好了,闲话少说,先说一下我程序的状况

http://s8/middle/6084f588ga4f8372eafe7&690


在一对话框中拖入一个DATAGRID再给它关联一个变量m_datagrid

然后在对话框对应类的构造函数中加入如下代码:

       // TODO: Add your message handler code here

       //进行数据库的连接(通过ADO方式)

       _ConnectionPtr pConn;

       if (FAILED(pConn.CreateInstance("ADODB.Connection")))

       {

              AfxMessageBox("Create Instance failed!");

       }

      

       CString strSRC;

       strSRC="Driver=SQL Server;Server=";

       strSRC+="127.0.0.1";

       strSRC+=";Database=";

       strSRC+="myDatabase";

       strSRC+=";UID=sa;PWD=";

      

       _bstr_t strConnect= _bstr_t(strSRC);

       //connecting to the database server now:

       try{

              pConn->Open(strConnect,"","",NULL);

              ::MessageBox(NULL,"恭喜","Hello",MB_OK);

       }

       catch (_com_error &e)

       {

              ::MessageBox(NULL,e.Description(),"警告",MB_OK|MB_ICONWARNING);

       }

      

      

       //打开表

       _RecordsetPtr m_pRecordset;

       if(FAILED(m_pRecordset.CreateInstance( ("ADODB.Recordset"))))

       {

       }

      

       try{

              m_pRecordset->Open(_variant_t("t_student"),

                     _variant_t((IDispatch *)pConn,true), adOpenKeyset,

                     adLockOptimistic, adCmdTable);

              ::MessageBox(NULL,"打开t_student表。","成功",

                     MB_OK);

       }

       catch (_com_error &e)

       {

              ::MessageBox(NULL,"无法打开t_student表。","提示",

                     MB_OK | MB_ICONWARNING);

       }

       m_datagrid.SetRefDataSource((LPUNKNOWN)m_pRecordset);

 

前面不做过多解释,只解释最后一行,将数据集中的内容显示到m_datagrid所对应的控件中(此为t_student)

 

然后运行程序,出现

http://s7/middle/6084f588g76e59f3261a6&690


 

继续调试,定位错误

http://s13/middle/6084f588g76e59f43175c&690

定位在

ASSERT(m_pCtrlSite!=NULL);    //not an OLE control

 

从网上知,此错误为空指针错,也就是m_pCtrlSite未初始化(对应OLE控件为m_datagrid),

可通过调用Create方法解决,于是我调用Create方法,上述问题是解决,不幸的是,又抛出另外一个错误窗口.

 

我想,既然已经关联了变量怎么还会是空呢,很有可能是错误出在调用顺序上

我想,控件变量通过调用

http://s12/middle/6084f588g76e59f8aeb3b&690


函数进行数据交换,很有可能程序的调用顺序是先进行构造函数,再进行DoDataExchange调用,是不是这样调试一下就知道了

我在构造函数和DoDataExchange函数处各加一个断点,调试

http://s4/middle/6084f588ga4f83c2e20b3&690

 

没错程序果然先停在了构造函数处,

也就是说我们的m_datagrid还没进行数据映射就已经在构造函数中调用了,因此会抛出上面的异常.

那么我们就只能去考虑虚函数或者是window handler,

经测试这个可用

http://s12/middle/6084f588ga4f83ccd960b&690

 

把构造函数中的内容移到这个处理中问题解决,看一下结果

http://s6/middle/6084f588ga4f83d4d4d65&690

 

这样就OK

 

总结:::::::::::::::::::::::::

原来我是不喜欢把自己的一些调试过程记录下来的,觉得有些浪费时间,当然我也不喜欢去截图去敲内容,但后来发现我没有那么好的记忆力,因为每一个问题的解决都是从网上众多文章,源码中提炼出来的,当再次遇到同类我又不得不辛苦再去查,反而浪费更多时间精力,当然更加是耐心。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有