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_dbですかDatabase""上記の user と pwd の両方でも試しましたが、同じ結果が得られました.7では動作しますが、XPでは動作しません。

Windows 7 では正しく動作するのに、Windows XP では動作しないのはなぜですか? これを修正するにはどうすればよいですか?

4

1 に答える 1

1

私は解決策を見つけました。私の正確な解決策については、太字のセクションを参照してください。これにより、他の人も解決する可能性があります。

このウェブサイトから取得)

ノート

•あなたが C++ 開発者で、アプリケーションに次のコード行を含めるシナリオを考えてみましょう。

#msado15.dll をインポート

MSJRO を使用しておらず、Windows Vista、Windows Server 2008、またはそれ以降のバージョンの Windows でアプリケーションを再コンパイルするというシナリオを考えてみましょう。コンパイルされたアプリケーションは、Windows Vista、Windows Server 2008、またはそれ以降のバージョンの Windows で実行する必要があります。このシナリオでは、#import msado15.dll を次のように変更する必要があります。

#msado60.tlb をインポート

MSJRO を使用していて、Windows Vista、Windows Server 2008、またはそれ以降のバージョンの Windows で実行する必要があるアプリケーションを再コンパイルするというシナリオを考えてみましょう。このシナリオでは、#import msado15.dll を次のように変更する必要があります。

#msado28.tlb をインポート

Windows XP または Windows Server 2003 でアプリケーションを再コンパイルするシナリオを考えてみます。または、再コンパイルしたアプリケーションを Windows XP または Windows Server 2003 で実行する必要があります。このシナリオでは、#import msado15.dll を次のように変更する必要があります。

#msado28.tlb をインポート

于 2013-07-23T16:41:10.573 に答える