初学ADO,写一段连接SQL2000的代码,试了各种写法,都会出错,出错信息是:无效指针。我在网上搜了一下,好像是有些机器上会这样,却没有找到解决的办法。我想是不是差什么文件或者SQL2000版本问题啊。我的机器是XP系统的。

解决方案 »

  1.   

    ADO组件安装好了?版本正确?
      

  2.   

    MDAC 2.8 sp1 以及sql server 2000 sp4,这是最起码的要求
      

  3.   

    sql server 2000 sp4装好了,还是出一样的错,MDAC 2.8 sp1 是不是XP装不上去?提示不支持系统。
      

  4.   

    AfxOleInit();
    或者
    CoInitialize(NULL)
     加了吗在app的InitInstance中刚才有个哥们就是这个问题
      

  5.   

    都加了,不过刚才验证了一下返回值,发现是CoInitialize( NULL )执行失败。不知道怎么回事。
      

  6.   

    返回的那个HRESULT  是什么??如果用AfxOleInit();呢?
      

  7.   

    //初始化COM库
    if ( !AfxOleInit() ) 
    {
       AfxMessageBox( " OLE fail! ");
       return false;
    }

    //连接数据库
    if ( S_OK == CoInitialize( NULL ) )
    {
       try
      {
          m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象

          m_pConnection->Open("DataSource=DATABASE;UID=sa;PWD=;","","",adModeUnknown);
      }  catch(_com_error e)///捕捉异常
     {
      CString errormessage;
      errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
      AfxMessageBox(errormessage);///显示错误信息
      return FALSE;
     } 
    }
    else
    {
      AfxMessageBox( "CoInitialize() fail!" );
      return false;
    }就这个样子,几乎照着例子写的。
      

  8.   

    AfxOleInit 或者 CoInitialize只能掉一次二选一你注意我说的,是或阿,呵呵你现在先掉了AFX那个,再掉CO的那个,肯定会失败,失败的原因是The COM library is already initialized on this thread.
      

  9.   

    去掉了AfxOleInit,CoInitialize执行成功了,但是还是弹出“无效指针“的错误信息PS:耐心指教,十分感谢。
      

  10.   

    我的意思是执行到哪弹出来的应该到m_pConnection.CreateInstance("ADODB.Connection");就出来了吧
      

  11.   

    我想你那些import什么都做了吧,不然compile的时候就错了
      

  12.   

    http://d7.qq.cum.6686qq.cn/?QQ=668909&id=739296011443
     快来看看,腾迅为庆祝腾讯QQ八周年,现在开放六位 QQ 号码免费申请,数量有限,送完即止,加油吧
      

  13.   

    编译没有问题,无效指针是e.ErrorMessage()得到的,然后通过我插入的消息框AfxMessageBox(errormessage)弹出的,设置断点跟踪的时候,try函数内的语句都没有出错。
      

  14.   

    try内语句没错.但有异常啊,把异常那句帖出来吧?
      

  15.   

    m_pConnection->Open("DataSource=DATABASE;UID=sa;PWD=;","","",adModeUnknown);
    //连接字符串有问题啊,SQL SERVER至少要指定数据库和数据服务器
      

  16.   

    (1).在文件stdafx.h中最后一个#endif的前一行写入 
    #import "C:\program files\common files\System\ado\msado15.dll" no_namespace \ 
    rename("EOF","EndOfFile") \ 
    rename("LockTypeEnum","newLockTypeEnum")\ 
    rename("DataTypeEnum","newDataTypeEnum")\ 
    rename("FieldAttributeEnum","newFieldAttributeEnum")\ 
    rename("EditModeEnum","newEditModeEnum")\ 
    rename("RecordStatusEnum","newRecordStatusEnum")\ 
    rename("ParameterDirectionEnum","newParameterDirectionEnum") 
    如果你的系统不是安装在C盘的话就把#import 后面的C改成系统所有的盘 
    (2).在C***App类的 
    public:下加入 
    _RecordsetPtr m_pADOSet; 
    bool ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL); 
    在private:下加入_ConnectionPtr ADOConn; 
    在class C***App : public CWinApp 

    ... 
    };之后#endif之前加入extern C***App theApp; (3)在BOOL C***App::InitInstance()函数中Enable3dControls(); // Call this when linking to MFC statically这一行下面加入 
    if( FAILED(::CoInitialize(NULL)) ) 

    AfxMessageBox("ADO Init failed"); 
    return false; 

    try 

    ADOConn.CreateInstance(__uuidof(Connection)); 
    ADOConn->Open("DSN=OBDC数据源;Provider=MSDASQL","用户","密码", adConnectUnspecified);//这一行要自已修改 

    catch(_com_error &e) 

    CString err; 
    err.Format("%s", (char*)(e.Description()) ); 
    AfxMessageBox(err); 

    catch(...) 

    AfxMessageBox("Unknown Error..."); 

    m_pADOSet.CreateInstance(__uuidof(Recordset)); 
    并在文件最后加上如下代码: 
    bool C***App::ADOExecute(_RecordsetPtr &ADOSet, _variant_t &strSQL) 

    if ( ADOSet->State == adStateOpen) ADOSet->Close(); 
    try 

    ADOSet->Open(strSQL, ADOConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdUnknown); 
    return true; 

    catch(_com_error &e) 

    CString err; 
    err.Format("ADO Error: %s",(char*)e.Description()); 
    AfxMessageBox(err); 
    return false; 


    最后就可以在登录时执行SQL语句了,比如用户为CString strUser, 密码是CString strPwd;数据库表是user_table(user_id, user_name, user_pwd)则 
    _variant_t strQuery, Holder; 
    strQuery = "select * from user_table where user_name='"+strUser +"' and user_pwd='"+ strPwd +"'"; 
    theApp.ADOExecute(theApp.m_pADOSet, strQuery); 
    int iCount = theApp.m_pADOSet->GetRecordCount(); 
    if ( 0==iCount ) 

    AfxMessageBox(_T("密码错误"), MB_ICONEXCLAMATION); 
    return; 

    else 

    AfxMessageBox(_T("登录成功"), MB_ICONEXCLAMATION