各位大虾:
    我用VC写了一个DLL需要连接数据库,可是每次都连不上,截取他的代码用在应用程序中就可以,这是为什么?需要怎么做才能连上,最好能有代码?谢谢,实现给分

解决方案 »

  1.   

    是吗?我的代码是:
    在stdafx.h中
    #import "C:\Program Files\Common Files\System\ADO\msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")这两个是全局变量
    _ConnectionPtr  g_pAdoCn;
    _RecordsetPtr g_pAdoRs;在工程中的InitInstance() 
    ::CoInitialize(NULL); //初始化OLE/COM库环境
    g_pAdoCn.CreateInstance(__uuidof(Connection));
    g_pAdoRs.CreateInstance(__uuidof(Recordset));
    CString StrCn=_T("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=database.mdb");
    g_pAdoCn->PutConnectionTimeout(100);
    if (g_pAdoCn->Open(_bstr_t(StrCn),"","",-1))
    {
    AfxMessageBox("OK");
    }
    else
    AfxMessageBox("NO");得到的结果是NO
      

  2.   

    把::CoInitialize(NULL); //初始化OLE/COM库环境 去掉试试
      

  3.   

    请问: Connection -> Open 的值返回是bool类型吗?
      

  4.   

    给你一个包装ADO Recordset Export To Excel的DLL例子#include ....// 判断返回值,如果是 E_XXXX 则throw 
    static void TESTHR(HRESULT x) { if FAILED(x) _com_issue_error(x); }//
    // 创建OLE自动INIT|UNINIT对象
    struct StartOle {
        StartOle() { CoInitialize(NULL); }
        ~StartOle() { CoUninitialize(); }
    } _inst_StartOle;//
    //
    int XLSAPI WINAPI xls_CopyRecordsetFromStr( LPCTSTR szConnStr, 
                                               LPCTSTR szSQL,
                                               LPCTSTR szTitle,
                                                BOOL bVisible, BOOL bQuit )
    {
        using namespace Excel;
        _RecordsetPtr   pRst  = NULL;
        _ConnectionPtr  pConnection    = NULL;
        FieldPtr     _MyPtr= NULL;    _ApplicationPtr pXL = NULL;
        WorkbooksPtr    pBooks = NULL;
        _WorkbookPtr    pBook = NULL;
        _WorksheetPtr   pSheet = NULL;
        RangePtr        pRange = NULL;
        // Define string variables.
        _bstr_t strCnn( szConnStr );
        _bstr_t strSql( szSQL );
        _bstr_t str;
        HRESULT  hr = S_OK;   try {
            //
            // 为什么 try catch 块中,CreateInstance还要加TESTHR来判断
            // 因为_com_ptr_t的CreateInstance 是直接返回 HRESULT
            // 并非如ADO xxxPtr之类返回值是错误就抛出异常,
            // CreateInstace 是不抛的,这个可以说是一BUG,但很多人没注意,以为try就OK了
            TESTHR( pXL.CreateInstance(L"Excel.Application"));        pXL->Visible = ( (bVisible) ? VARIANT_TRUE : VARIANT_FALSE);        pBooks = pXL->Workbooks;
            pBook  = pBooks->Add((long)xlWorksheet);        pSheet = pXL->ActiveSheet;        pSheet->Name = szTitle;        // open connection and record set        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
            pConnection->Open(strCnn,"","",NULL);        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));
            TESTHR( pRst->Open(strSql, 
                    _variant_t((IDispatch *)pConnection,true), adOpenKeyset,
                    adLockOptimistic, adCmdText));
             
            for( int i = 0; i < pRst->Fields->Count ; i++ )
            {
                 _get_cellid( str, i );
                 pSheet->Range[ str ]->Value = pRst->Fields->GetItem( _variant_t((long)i,VT_I4) )->Name;
            }
                
            pRange  = pSheet->Range["A2"];
            pRange->CopyFromRecordset( pRst );
            pRst->Close();
            
            
            pConnection->Close();
            if( bQuit )
                pXL->Quit();
        }
        catch(_com_error &e)
        {
            return -1;
        }
        return 0;
    }
      

  5.   

    建议先加try 捕捉错误,然后分析
      

  6.   

    有可能是stdafx.h中重复引用了关于db的h文件,与ado import的dll对应的h文件重复定义的冲突