Приложение ADO, скомпилированное в Windows 7, работает в Windows 7, не работает в Windows XP, msado15.dll

У меня есть программа, которая использует 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? И что я должен сделать, чтобы исправить это?

2

Решение

Я нашел решение. См. Жирный раздел для моего точного решения, хотя это может также решить другие.

(Взято из этот сайт)

Заметки

• Рассмотрим сценарий, в котором вы являетесь разработчиком на 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

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector