2

我有一个使用 msado15.dll 连接到数据库的程序。该程序在我的 Windows 7 机器上运行良好,但大多数(如果不是全部)最终用户都在运行 Windows XP,但它无法正常工作。我已经确定错误是在打开数据库时,但似乎没有错误消息,所以我不确定出了什么问题。这是我编写的代码,以及打开数据库的调用:

数据库.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();
};

数据库.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 上却不行?我应该怎么做才能纠正这个问题?

4

1 回答 1

1

我找到了解决方案。有关我的确切解决方案,请参阅粗体部分,尽管这也可能解决其他问题。

(取自本网站

笔记

• 考虑您是 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

于 2013-07-23T16:41:10.573 回答