在98下编译一切正常
但是运行后进行正常的操作
老是出现 C++ RUNTIME LIBRIRAY ERROR比如下面的这条语句就可以导致一个C++ RUNTIME LIBRIRAY ERROR:Mycs.m_pRecordset=Mycs.m_pConnection->Execute(Command,&RecordsAffected,adCmdText);谁有经验知道这个如何解决?

解决方案 »

  1.   

    急啊程序交付给了客户开始他们没说清楚
    我一直在2K下开发的现在他们运行这个程序的机器有98有2K
    凡是2K的机器都正常
    98的机器都不能运行
    他们催我快点解决55555555555555555555555555555555555555555
      

  2.   

    是不是动态连接库版本不一致,或者是ADO版本不一样.
      

  3.   

    是不是UNICODE的问题啊?98不支持UNICODE哦
      

  4.   

    有没有用try catch捕捉一下错误啊?建议试一下...然后单步调试...
      

  5.   

    sr388(找北):
    我没用到UNICODE,应该不是这个问题
    lzd(雨中绝音):
    捕捉错误没用,一旦出错程序的功能就完成不了,所以必须找到出错的原因
    单步调试过了

    Mycs.m_pRecordset=Mycs.m_pConnection->Execute(Command,&RecordsAffected,adCmdText);
    这一句导致出错在WIN2000下同样的代码完全正常
      

  6.   

    应该是98和2k的ADO库文件可能不一样
      

  7.   

    Mycs.m_pConnection->Execute(Command,&RecordsAffected,adCmdText);
    是一个查询还是一个别的操作?
      

  8.   


    在执行这个语句Mycs.m_pRecordset=Mycs.m_pConnection->Execute(Command,&RecordsAffected,adCmdText); 前 Mycs.m_pRecordset
    是不是为自由的Recordset 对象, 也就是说Mycs.m_pRecordset为不为
    空,如果不是则应该在执行前加上Mycs.m_pRecordset=0; 
      

  9.   

    freelove1() :
    是为空..............
      

  10.   

    if (Mycs.OpenConnection())
    {
    _bstr_t Command=" select password,access from access where username=";
    CString UserName="'";
    UserName=UserName+LDlg.m_cUserName;
    UserName=UserName+"'";
    _bstr_t temp((const char*)UserName);
    Command+=temp;
    _variant_t RecordsAffected;
    Mycs.m_pRecordset=Mycs.m_pConnection->Execute(Command,&RecordsAffected,adCmdText);
      

  11.   

    装一个MDAC2.7,在微软的网站上有Download的。
      

  12.   

    对不起,今天才看到你的帖子
    前几天的时候有位帅哥遇到了和你一样的问题,呵呵
    我想可能是预编译头文件中import的路径不对
    后来经他反馈回来的消息说果真是这个问题
    2000和98的ADO库文件是不同的
    你下一个MDAC2.7,然后将import中改成msado20.dll就行了,hehe
      

  13.   

    wangxi13720(望昔):faint
    难道要求客户所有的98机器上都重新下载MDAC2.7来安装?成本太大了几百台机器啊
      

  14.   

    wangxi13720(望昔):
    能不能把import 的路径改为自己的
    然后把msado20.dll和程序一起发布出去?
      

  15.   

    數據庫文件要用access97生成,最好是英文版
      

  16.   

    WIN98下的ado的版本与WIN2000地下的版本的ado的接口号不太一样,微软做过调整,这方面的文章论坛曾经有过。我找找再告诉你吧!
      

  17.   

    Yings() :
    谢谢
    我现在的疑问就是 怎样解决这个问题。如果是因为版本不同那么在98下编译后应该没问题
    如果非要下载MADC2.7在每台客户机上安装那么就太麻烦了,简直不敢想像
    不知道随着程序一起发布msado20.dll行不行?因为我记得MADC是需要安装的,我担心简单地随程序附带msado20.dll解决不了问题
    现在我这里又没有测试环境:(全部是WIN2K和XP)微软的站点我从昨天晚上开始就连不上去
    大家访问都正常吗?
      

  18.   

    附带msado20.dll没问题的,你安装后注册(regsvr32 msado20.dll)一下就没问题了,以后的调用就会从该组件中调用方法,你可以测试一下。
      

  19.   

    ???
    我刚刚安装了MDAC 2.7
    怎么没看到 msado20.dll?
      

  20.   

    http://expert.csdn.net/Expert/topic/1265/1265959.xml?temp=.6054499
      

  21.   

    对应MDAC2.7的DLL到底是msado20.dll还是msado15.dll?在http://www.microsoft.com/data/mdac27info/MDAC27Readme_chinese_simplified.htm
    上面看到MDAC2.7对应的文件仍然还是msado15.dll sunyou(sunyou):
    你贴的地址是DAO的解决办法
    ADO的解决办法是一样的????
      

  22.   

    我已经晕了
    我在2K下安装了MDAC2.7后
    程序无法连接上SQL了FUCK
      

  23.   

    连接不上SQL的问题解决了现在就是在98下怎么解决这个问题
    请大家不要给出连接什么的直接告诉我解决办法1:在98机器上是不是只有安装MDAC2.7才能解决问题?
    2:MDAC2.7对应的DLL是msado15.dll还是msado20.dll?不是我不想去测试
    而是我现在这里没有测试环境
    我要等把这些弄清楚后去一个很远的地方才能找到98的机器去测试
    不然我早一一把上面的办法测试一遍.
      

  24.   

    看看这篇文章。
    =================================================
    标题     我的ATL/ADO编程的曲折经历    horris(原作) 
      
    关键字     ADO,MDAC,VC,#import,Smart Pointer 
      
        我在用VC6的ATL作一个组件,它内部通过ADO访问Access数据库。因为ADO本身也是一系列组件,因此,ATL项目要引入ADO类型库,我是用以下语句引入的(假设Windows安装在C盘):
    #import "C:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace named_guids rename("EOF","adoEOF")
    这是在微软的官方教材(1015 Mastering COM Development using Visual C++ 6.0)上讲的引用ADO的标准方法,教材上说,这样可以使你能使用最新的ADO版本。请注意,这是第一个麻烦所在。
    Access数据库是在Access97上建立的,所以我用了Jet 3.51的OLE DB Provider,也就是说Connection串是:
    “Provider=Microsoft.Jet.OLEDB.3.51;”
        这是第二个造成麻烦所在。
        我的开发环境是Win2K,这是第三个麻烦所在。下面请听我慢慢道来。
    好了,在 Win2K上调试一切正常。我一直很信任2K,因为在2K上调程序系统很稳定,另外速度好象比在98上快,最重要的是很多在98上用Debug跟踪不到的错误,在2K上都能跟踪到!我信心百倍地交给用户了。用户机器是Win98SE,另外装了Access2000。但是用户机器上报错:”Create ADODB.Recordset failed”!当然98没有这么智能,这个错误信息是我留了个心眼儿,在程序中让它报的:
     _RecordsetPtr pRs=NULL;
     if (pRs.CreateInstance(CComBSTR("ADODB.Recordset"))!=S_OK)
     {
      Error("Create ADODB.Recordset failed");
      return E_FAIL;
     }
        98不会不支持ADO呀!我首先想到会不会是Access2000的问题?但是也不应该,虽然在Access2000执行界面不能修改Access97的数据库结构,但是因为Access2000是Jet4.0驱动,它应该向下兼容地呀!通过ADO是可以修改结构的,何况我并没有修改结构,我甚至连数据都没有修改!
        翻箱倒柜地一通查,在MDAC 2。5的帮助文件中我找到了:从ADO2。1开始提供的JET4。0 OLE DB Provider将禁用某些JET3。5x的文件,该死的微软!我不得不把连接串改成了:
    “Provider=Microsoft.Jet.OLEDB.4.0;”
        毕竟现在用户机器都升级到Office2000了,用Access97的人不多了。但是仍然报那个错!换到另一台装了WinMe的机器上安装运行,运行正常!这是怎么回事?我差点怀疑那个装98的机器系统有问题。于是我查它的注册表,HKEY_CLASSES_ROOT\CLSID下是有ADODB.Recordset的。在几乎绝望之际,我发现了这个:
    #import msado15.dll生成的文件msado15.tlh里,_Recordset的IID是
    "00000556-0000-0010-8000-00aa006d2ea4",而那个倒霉98机器的注册表的HKEY_CLASSES_ROOT\Interface下没有这个IID!我赶紧用OLE View查看了98上的msado15.dll,却在里面看到了_Recordset接口,所有Interface,coclass应有尽有。有意思有意思!编了这么多年程序,让我长了记性:永远不要怀疑系统有问题、编译器有问题,永远要坚信是自已的程序的问题。幸亏我还算有点观察力,我发现这个98机器上的msado15.dll的_Recordset接口的IID是:
    "00000555-0000-0010-8000-00aa006d2ea4"
        看见没有,一个是556,一个是555,它们不是一个接口!好,仔细看看OLE View为我揭示的msado15.dll:_Recordset派生于Recordset20,Recordset20派生于Recordset15,Recordset15就差不多到根上了(怪不得文件名是msado15而不是msado20或别的),它们每个的IID都不一样。我又看了看2K上的msado15.dll, _Recordset派生于Recordset21,Recordset21派生于Recordset20,下面的派生树与98上的就一样了。我又注意到,2K的msado15.dll的library节的version属性是2.5,也就是说typelib版本是2.5,而98上的是2.1。
        我终于明白了,原来我开发用的ADO版本与用户机器上的用户版本不一样,开发用的是ADO2。5,而用户机器上的是ADO2。1。ADO 2。1版的Recordset命名为Recordset21,2。0版的Recordset命名为Recordset20,依此类推,而ADO总是把最新版的Recordset接口命名为_Recordset。所以在用VC的#import时,生成的_RecordsetPtr是msado15.dll支持的最高版的Recordset。
        那么,我怎么能知道用户机器安装了哪个ADO版本呢?
        在MSDN中没有直接的方式查找这方面的信息,或者说我无从下手。我只好用“搜索”功能。搜索“MDAC”查到的主题数大大超出我的想象—有500页之多!幸亏没查“ADO”,那样会更多。在看了三五个主题后,我有些头大了,微软的数据库存取技术的版本控制太混乱了!在咬牙坚持看完了不下十个主题后,终于理出了一些头绪。
        首先,M$ Bless Me! 这个主题在搜索结果中比较靠前,使我及时了解了一些基本概念,能坚持看完后面的主题:
    INFO: What are MDAC, DA SDK, ODBC, OLE DB, ADO, RDS, and ADO/MD?
    ID: Q190463
    MDAC是ODBC, OLE DB, ADO, RDS四类数据库存取技术的总称。比较象样的MDAC包是从版本1.5开始的。它包括ODBC 3.5, OLE DB 1.5, ADO 1.5, RDS 1.5。2.0的MDAC曾一度被命名为Data Access SDK 2.0,它包括ODBC 3.51, OLE DB 2.0, ADO 2.0, RDS 2.0。以后的ADO版本基本上和MDAC的版本一致。除了大版本外,还有象1.5b,1.5(PDC)等小版本,但是大版本的功能是差不多一样的。
        好了,我关心的是怎样确定用户机器的ADO版本,然后才能知道要发布哪些文件。到用户机器上手工查看msado15.dll的Typelib版本总不是个办法。这个主题好象有点用:
    HOWTO: Determine the Version of MDAC 
    ID: Q269490
        不过这要下载一个Component Checker的软件,或者依靠一个并不可靠的注册表项。我更想知道:给定一个用户机器的软件配置,能确定它支持的ADO最小版本。
    M$ Bless Me Again! 下面的主题又比较靠前:
    INFO: Microsoft Data Access Components (MDAC) Release History 
    ID: Q231943     请看OLE DB/ADO的曲折发展进程和混乱的版本发布:    MDAC 1.5在以下产品中安装了Beta版:NT Options Pack(IIS 4)/IE4/Win98,正式发布是在08/01/1997的IE4,也就是说,Win98或是Win95+IE4可以保证ADO1.5的存在。而在NT内核的操作系统中,NT4/OP/IIS4也最少可以用1.5。
        在07/01/1998的NT4的SP4中,包含了MDAC 2.0。这回NT内核超过了98内核。
    在3/15/1999的IE5中,包含了MDAC 2.1,我们知道Win98SE是与IE5绑定的。这回98内核领先了。
    4/1/1999,NT上的BackOffice 4.5赶了上来,支持MDAC 2.1了。2/17/2000, Windows 2000来了个大一统,干脆绑定了MDAC 2.5。
        呵呵,我用的是MSDN January 2001,后面的事情就查无出处了。我看过WinMe的缺省安装,是支持MDAC 2.5的,98内核与NT内核走到一起了。
        后来发布的还有MDAC 2.6,我估计它是独立发布的。我有一台装XP的机器已经装上VS.net了,VS.net要求安装MDAC 2.7。我已分不清楚2.6和2.7哪个是与XP绑定的了。不过后面你将看到,对主要用ADO.Recordset对象的编程者来说,MDAC 2.5与2.6/2.7差别不大。
        
        下面让我们看看ADO各版本中的Recordset对象都有哪些变化。
        Recordset15没有完善的Clone和Resync方法,另外很可能不支持异步方法调用(asynchronous method)。这些都在Recordset20里实现了,Recordset20的Cancel方法支持终止异步方法调用。ADO 2.0还实现了Recordset的Persistance,不过只支持ADO专用的ADTG(Microsoft Advanced Data TableGram)格式。
        Recordset21增加了Seek方法和Index属性。另外在Persistance方面还支持部分的XML格式。
    从ADO 2.5起,Persistance得到了很大的完善。Recordset对象完全支持Persistance到XML格式,但是这依赖于Microst XML Parser,也就是msxml.dll,它从IE5开始提供。Recordset对象还可以Persistance到任何实现了IStream接口的对象,并且ADO 2.5还提供了Stream对象。因此,ADO 2.5的Recordset可以直接Persistance到IIS5(Windows 2000绑定)的ASP Response/Request对象,为ASP的数据存取编程提供了极大的方便。
        ADO 2.5以后的2.6,2.7版本对Recordset的接口没有再做改动,所增强的是其他ADO对象,例如ADO 2.7中支持Command 2.7对象。对于主要使用Recordset对象的开发者来说,2.5与2.6,2.7区别不大。
    好了,我班门弄斧地总结了ADO的发展历程和各版本的功能,下面该讨论一下如何发布ADO应用程序了。
    需要说明的是,MDAC包不仅随操作系统和IE发布,它也经常做为一个单独的包发布,例如在PDC(Professional Developer’s Conference)上。它还随一些应用系统发布,如BackOffice,SQL Server等,尤其是它也随Visual Studio发布。VS6中包含MDAC 2.0,而VS6的SP3包含MDAC 2.1。不过这些不是我们开发者考虑的主要问题.我想如果你在你的软件安装需求中写上“本软件要求您安装了MDAC X.X”会使大多数用户看不懂,包括许多MCSE(BTW:我是MCSD,因为D在E之前,所以我有优越感)。“本软件要求您安装了VS6或者SQL Server”也经常会使用户感到手足无措,而“要求Win98SE/WinNT+IE5/Win2K”比较清晰明了。用户对自已用的操作系统和IE的版本是比较清楚的,这两样也是必装的,所以在确定用户机器的MDAC环境时,我觉得还是主要依赖于对这两样的判断为好。
        MDAC包有一个安装程序mdac_typ.exe,可以把它加到你的应用程序的安装工程中去,当用户机器的ADO版本比你的要求低时用它安装高版本的MDAC。在VS6的安装盘中你可以找到这个程序。MSDN的这个主题可以提供帮助:
    Redistributing MDAC
        但是这要在安装工程中做很多文章,而且安装包将会变得很大,另外你还可能和M$惑上官司,如果你是用D
      

  25.   

    看了上面这一大通
    还是不太清楚只是MDAC的版本问题
    那么我程序在98下完全重新编译后应该就可以正常了,事实上这样不行而且按照上面这个帖子里说的方法
    我的代码都要重新写了,因为_bstr_t和_variant_t类都无法用了。哎,看来只有自己想办法了FUCK CSDN
      

  26.   

    暂时就打算这样了自己随程序附带一个msado15.dll,然后regsvr32 msado15.dll
      

  27.   

    han寒 !如果是98的机器,你就看看它的ADO库文件的版本是什么照着写路径不就行了MDAC2.7的库文件是MSADO20.DLL,2K里是msado15.dll,98里的版本可能更低,但具体是多少我就不太清楚了你既然是做工程,现装一个98不就行了一定要为你的工程做好一切准备,懂么?
    ps:#import中的路径当然可以改为自己的文件,不过msado15/20.dll win98系统可能会不支持,你加进去也没用,必须要用98下的库文件,hehe
      

  28.   

    http://www.csdn.net/Develop/article/16/16063.shtm
    当然也可以import msado15/20.tlb
    昨天这儿一直上不来,所以
      

  29.   

    >: snsins(不再信仰,不再坚持)
    >暂时就打算这样了>自己随程序附带一个msado15.dll,然后regsvr32 msado15.dll我不太推荐你这么做,你这样做会影响到其他用ADO的程序,除非这台机子是为你的程序专用的。你应该搭一个win98的平台,用他自带的ADO版本在其底下调试。
      

  30.   

    谢谢各位
    我一定搞定了发现了问题所在
    因为数据库用的是SQL2000
    而访问SQL2000要求必须是MDAC2.5以上如果不更新MDAC的话即使在98下编译也没用