小弟真的快被他弄疯了,也许自己知识不够全面吧,现把疑点与大家讨论一下,也许自己水平有限,希望各位多多指点:疑点一:在dll里面用ado 连接sqlserver, 连接信息没有错,但是就是不能与数据库建立连接,而奇怪的就是,用相同的代码,用access的连接信息却可以很正常的连接access数据库。疑点二:还是用相同的代码,在mfc exe application下面连接sqlserver就可以很正常的连接数据库,用access连接也可以//////////////////////////调试2///////////////////////////////
::CoInitialize(NULL);///初始化COM库
    _ConnectionPtr m_pConnection;
//  _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
hr = m_pConnection.CreateInstance( __uuidof ( Connection ) );///创建Connection对象
if(SUCCEEDED(hr)) {
//access可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库

//sql server不行
hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=ricky;Initial Catalog=dbTest; User ID=sa;Password=","","",adModeUnknown);///连接数据库
MessageBeep(MB_OK);
}
}
catch(_com_error e) {  ///捕捉异常 
MessageBeep(MB_ICONASTERISK);
}//////////////////////////////////////////////////////////
换成下面的代码还是相同的疑点://////////////////////////调试1///////////////////////////////
AfxOleInit();///初始化COM库
    _ConnectionPtr m_pConnection;
//  _RecordsetPtr m_pRecordset;
////////////连接数据库//////////////
HRESULT hr;
try {
PlayText("1");
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr)) {
//accss可以
//hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
//sql server就是不行,真搞不懂.....:(
hr = m_pConnection->Open("Provider=sqloledb;Data Source=ricky;Initial Catalog=dbTest;Integrated Security=SSPI;","","",adModeUnknown); //连接数据库
PlayText("2");
}
}
catch(_com_error e) {  ///捕捉异常 
PlayText("错误");
}
////////////////////////////////////////////////////////////////
如能解决问题,1000分送给高手们我都值得。急!!!!!!!!!

解决方案 »

  1.   

    你贴的代码是完全正确的,绝对没有问题。
    应该考虑其他因素。
    你应该看看连接不成功的错误码是什么,才能对症下药。改这段:
    catch(_com_error e) {  ///捕捉异常 
    MessageBeep(MB_ICONASTERISK);
    }为这段:
             catch(_com_error &e)
    {
    dump_com_error(e);
    }void CMyclassname::dump_com_error(_com_error &e)
    {
    CString ErrorStr;

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());
    ErrorStr.Format( "Error!\n\tCode = %08lx\n\tCode meaning = %s\n\tSource = %s\n\tDescription = %s\n",
    e.Error(), e.ErrorMessage(), (LPCSTR)bstrSource, (LPCSTR)bstrDescription );

    #ifdef _DEBUG
    AfxMessageBox( ErrorStr, MB_OK | MB_ICONERROR );
    #endif
    }看看错误信息是什么,查查ADO的帮助文件,或MSDN, 都会有很详尽的解释,
    告诉你为什么连接不上。
      

  2.   

    得到错误信息后你要还是解决不了,就交给我,
    保证你能在DLL里连上。
    别忘了送分欧 :)
      

  3.   

    很感谢兄弟的热心帮助,我用了以下的代码,得出的错误信息是,希望各位多多帮助,小弟感激不尽,全部分都送走也值得....
    ****************************
    Error!
         Code=80004005
         Code meaning=未指定的错误
         Source=Microft OLE DB Provider for SQL Server
         Desciption=不能装载通讯模块。驱动程序安装不正确。
    **************************** AfxOleInit();///初始化COM库
        _ConnectionPtr m_pConnection;
    //  _RecordsetPtr m_pRecordset;
    ////////////连接数据库//////////////
    HRESULT hr;
    try {
    hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
    if(SUCCEEDED(hr)) {
    //accss可以
    //hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库
    //sql server就是不行,真搞不懂.....:(
    hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=towin;Initial Catalog=dbTest; User ID=Ricky;Password=123","","",adModeUnknown);///连接数据库
    PlayText("正确");
    }
    }
    catch(_com_error  &e)
    {  
               CString  ErrorStr;  
                 
               _bstr_t  bstrSource(e.Source());  
               _bstr_t  bstrDescription(e.Description());  
               ErrorStr.Format(    "Error!\n\tCode  =  %08lx\n\tCode  meaning  =  %s\n\tSource  =  %s\n\tDescription  =  %s\n  ",  
                           e.Error(),  e.ErrorMessage(),  (LPCSTR)bstrSource,  (LPCSTR)bstrDescription  );  
                 
               #ifdef  _DEBUG  
                           AfxMessageBox(  ErrorStr,  MB_OK    |  MB_ICONERROR  );  
               #endif              
    }
      

  4.   

    各位兄弟若能在自己调试dll里面有成功的例子,希望能把全部的源代码发给我参考一下。小弟感激不尽email: [email protected]
      

  5.   

    用下列程序调试,它出现的错误是:****************************
    Error!
         Code=80004005
         Code meaning=未指定的错误
         Source=Microft OLE DB Provider for SQL Server
         Desciption=[Microsoft][ODBC SQL Server Driver]不能装载通讯模块。驱动程序安装不正确。
    ****************************
    //////////////////////////调试2///////////////////////////////
    ::CoInitialize(NULL);///初始化COM库
        _ConnectionPtr m_pConnection;
    //  _RecordsetPtr m_pRecordset;
    ////////////连接数据库//////////////
    HRESULT hr;
    try {
    hr = m_pConnection.CreateInstance( __uuidof ( Connection ) );///创建Connection对象
    if(SUCCEEDED(hr)) {
    //access可以
    //hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=dbTest.mdb","","",adModeUnknown);///连接数据库

    //sql server不行
    hr = m_pConnection->Open("Driver={SQL Server};SERVER=towin;USER ID=Ricky;PASSWORD=123;DATABASE=dbTest","","",adConnectUnspecified);///连接数据库
    MessageBeep(MB_OK);
    }
    }
    catch(_com_error &e)
    {            CString  ErrorStr;  
                 
               _bstr_t  bstrSource(e.Source());  
               _bstr_t  bstrDescription(e.Description());  
               ErrorStr.Format(    "Error!\n\tCode  =  %08lx\n\tCode  meaning  =  %s\n\tSource  =  %s\n\tDescription  =  %s\n  ",  
                           e.Error(),  e.ErrorMessage(),  (LPCSTR)bstrSource,  (LPCSTR)bstrDescription  );  
                 
               #ifdef  _DEBUG  
                           AfxMessageBox(  ErrorStr,  MB_OK    |  MB_ICONERROR  );  
               #endif              
    }
    //////////////////////////////////////////////////////////
      

  6.   

    不能装载通讯模块。驱动程序安装不正确。
    这不已经告诉你了吗?
    进入SQL的“服务器网络实用工具”把启用协议只留下TCP/IP,
    将连接字符改成IP地址
    “Data Source=ricky ...”改成
     "Data Source=xxx.xx.xxx "的形式
    试一下,还不行的话,换一台机子,装SQL客户端,再运行你的程序,总之这种错误与你的程序无关,是其他因素造成的,跟在不在DLL也无关。
      

  7.   

    运行Cliconfg.exe试试。再不就reinstall msdac.exe.