我有一个使用msado15.dll连接数据库的程序。该程序在我的Windows 7机器上运行得很好,但大多数(如果不是全部)最终用户都在运行Windows XP,但它无法运行。我已经确定错误是在打开数据库,但似乎没有错误消息,所以我不确定出了什么问题。这是我编写的代码,以及打开数据库的调用:
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
。我也为上面的用户和pwd尝试了""
,这给了我相同的结果:适用于7,但不适用于XP。
为什么这在Windows 7上正常运行,而不是Windows XP?我该怎么做才能纠正这个问题?
答案 0 :(得分:1)
我找到了解决方案。请参阅粗体部分了解我的确切解决方案,尽管这也可以解决其他问题。
(取自this website)
注释
•考虑您是C ++开发人员的情况,并在应用程序中包含以下代码行:
#import msado15.dll
考虑您未使用MSJRO的情况,并在Windows Vista,Windows Server 2008或更高版本的Windows上重新编译应用程序。已编译的应用程序必须在Windows Vista,Windows Server 2008或更高版本的Windows中运行。在这种情况下,您必须将#import msado15.dll更改为以下内容:
#import msado60.tlb
考虑您使用MSJRO的情况,并重新编译必须在Windows Vista,Windows Server 2008或更高版本的Windows中运行的应用程序。在这种情况下,您必须将#import msado15.dll更改为以下内容:
#import msado28.tlb
考虑在Windows XP或Windows Server 2003上重新编译应用程序的方案。或者,重新编译的应用程序必须在Windows XP或Windows Server 2003中运行。在这种情况下,您必须更改#import msado15。 dll以下内容:
#import msado28.tlb