我有一個程序使用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_db
是Database
。我也嘗試了""
用於上面的用戶和密碼,這給了我相同的結果:在7,但不是XP的作品。
爲什麼在Windows 7上可以正常工作,但不能在Windows XP上正常工作?我應該怎麼做才能糾正這個問題?
我正在使用以下#import字符串'#import no_namespace rename(「EOF」,「adoEOF」)' –
此外,Microsoft KB 2640696對於我看到的問題更加明確,[在Windows 7 SP1或Windows Server 2008 R2 SP1中編譯的基於ADO的應用程序不在早期版本的Windows中運行](http://support.microsoft.com/kb/2640696) –