2013-07-23 216 views
1

我有一個程序使用msado15.dll連接到數據庫。該程序在我的Windows 7機器上運行得很好,但大多數(如果不是全部的話)最終用戶正在運行Windows XP,但無法正常工作。我已經確定錯誤是打開數據庫,但似乎沒有錯誤信息,所以我不確定發生了什麼問題。這裏是寫的代碼我,以及調用打開數據庫:在Windows 7中編譯的ADO應用程序在Windows 7中運行不能在Windows XP中運行msado15.dll

Database.h:

#import "C:\Program Files\Common Files\System\ado\msado15.dll" \ 
rename("EOF","adoEOF") 

typedef ADODB::_RecordsetPtr RecPtr; 
typedef ADODB::_ConnectionPtr CnnPtr; 

struct Database { 
    CnnPtr m_Cnn; 
    Database(); 
    ~Database(); 
    bool Open(const char* CnnStr, const char* UserName, const char* Pwd); 
    RecPtr Execute(const char* CmdStr); 
    bool Close(); 
}; 

Database.cpp:

#include "stdafx.h" 
#include "Database.h" 
#include "ErrorDlg.h" 

using namespace ADODB; 

Database::Database() 
{ 
    m_Cnn = NULL; 
} 

bool Database::Open(const char *CnnStr, const char *UserName, const char *Pwd) 
{ 
    ::CoInitialize(NULL); 
    HRESULT hr; 
    try { 
     hr = m_Cnn.CreateInstance(__uuidof(Connection)); 
     m_Cnn->Open(CnnStr, UserName, Pwd, adConnectUnspecified); 
    } 
    catch (_com_error &e) { 
     CErrorDlg dlg; // makes a window that shows info aobut an error 
     // the following pops up on XP when you start the .exe file and attempt to connect 
     dlg.DoError(_T("Error opening database.")); //dlg.DoError(e.ErrorMessage()) gives me a blank message 
     return 0; 
    } 
    return 1; 
} 

RecPtr Database::Execute(const char *CmdStr) 
{ 
    try { 
     if (m_Cnn == NULL) 
      return NULL; 
     return m_Cnn->Execute(CmdStr, NULL, 1); 
    } 
    catch (_com_error &e) { 
     CErrorDlg dlg; 

     dlg.DoError(_T("Error executing database command.")); 
     return NULL; 
    } 
} 

bool Database::Close() 
{ 
    if (m_Cnn == NULL) 
     return 0; 

    try { 
     m_Cnn->Close(); 
     m_Cnn = NULL; 
    } 
    catch (_com_error &e) { 
     CErrorDlg dlg; 

     dlg.DoError(_T("Error closing database")); 
     return 0; 
    } 
    return 1; 
} 

Database::~Database() 
{ 
    try { 
     if (m_Cnn) { 
      m_Cnn->Close(); 
      m_Cnn = NULL; 
     } 
    } 
    catch (_com_error &e) { 
     CErrorDlg dlg; 

     dlg.DoError(_T("Error deconstructing database")); 
    } 
} 

打開數據庫這樣:

m_db.Open("driver={SQL Server};server=myServer;database=myDatabase","myUser","myPwd") 

其中m_dbDatabase。我也嘗試了""用於上面的用戶和密碼,這給了我相同的結果:在7,但不是XP的作品。

爲什麼在Windows 7上可以正常工作,但不能在Windows XP上正常工作?我應該怎麼做才能糾正這個問題?

回答

1

我找到了解決方案。請參閱粗體部分以獲取我的確切解決方案,但這也可能解決其他問題。

(來自this website兩者)​​

•考慮場景你是一個C++開發人員,你包括的代碼在應用程序中以下行:

#進口msado15 .dll

考慮您未使用MSJRO的情況,並且您在Windows Vista,Windows Server 2008或更高版本上重新編譯該應用程序Windows的ons。已編譯的應用程序必須在Windows Vista,Windows Server 2008或更高版本的Windows中運行。在這種情況下,必須更改#進口MSADO15.DLL以下幾點:

#進口msado60.tlb

考慮您正在使用MSJRO場景,並重新編譯必須在Windows Vista上運行的應用程序,在Windows Server 2008中,或在Windows的更高版本中。在這種情況下,必須更改#進口MSADO15.DLL以下幾點:

#進口msado28.tlb

認爲你在Windows XP或Windows Server上重新編譯應用程序的情況下2003年或者,重新編譯應用程序必須在Windows XP或Windows Server 2003在這種情況下運行,必須MSADO15.DLL的#import更改爲以下:

#進口msado28.tlb

+0

我正在使用以下#import字符串'#import no_namespace rename(「EOF」,「adoEOF」)' –

+1

此外,Microsoft KB 2640696對於我看到的問題更加明確,[在Windows 7 SP1或Windows Server 2008 R2 SP1中編譯的基於ADO的應用程序不在早期版本的Windows中運行](http://support.microsoft.com/kb/2640696) –

相關問題