2010-06-16 12 views
2

Nous avons une grande base de code qui utilise ADO sous 32 bits, et nous devons convertir le code en 64 bits. Nous utilisions le fournisseur Jet, mais je sais que ce n'est pas le supporté par x64. Nous importons des définitions de msado15.dll. À partir d'un il y a longtemps une version 64 bits de cette DLL est devenue disponible, mais nous ne pouvons pas pour le faire fonctionner.Accès, ADO et 64 bits

J'ai écrit un programme de test comme suit (MFC, en utilisant la DLL #imported):


map<CString, CString> mapResults ; 

_ConnectionPtr pConn = NULL ; 
CString strConn = _T("Provider=Microsoft.ACE.OLEDB.14.0;") 
      _T("Data Source=c:\\program files\\our_company\\our_database.mdb;"); 
    // (Above string only split for readability here.) 
CString strSQL = _T("SELECT * FROM [our_table] ORDER BY [our_field_1];"); 

try 
{ 
    pConn.CreateInstance(__uuidof(Connection)); 
    pConn->Open(_bstr_t(strConn), _bstr_t(_T("")), _bstr_t(_T("")), -1); 

    _CommandPtr pCommand = NULL; 
    pCommand.CreateInstance(__uuidof(Command)); 
    pCommand->CommandType = adCmdText ; 
    pCommand->ActiveConnection = pConn ; 
    pCommand->CommandText = _bstr_t(strSQL); 

    _RecordsetPtr pRS = NULL ; 
    pRS.CreateInstance(__uuidof(Recordset)); 
    pRS->CursorLocation = adUseClient ; 
    pRS = pCommand->Execute(NULL, NULL, adCmdText); 

    while (pRS->adoEOF != VARIANT_TRUE) 
    { 
     CString strField = (LPCTSTR)(_bstr_t)pRS->Fields->GetItem( 
(_bstr_t)_T("our_field_1"))->Value ; 
     CString strValue = (LPCTSTR)(_bstr_t)pRS->Fields->GetItem( 
(_bstr_t)_T("our_field_2"))->Value ; 
     mapResults[strField] = strValue ; 

     pRS->MoveNext(); 

    } 

} 
catch(_com_error &e) 
{ 
    CString strError ; 
    strError.Format(_T("Error %08x: %s"),(int)e.Error(), 
    e.ErrorMessage()); 
    mapResults[_T("COM error") ] = strError ; 

} 

Fondamentalement, le code liste de la table si elle réussit, ou lister les COM erreur obtenue en cas d'échec. Évidemment, nous avons testé le code sous 32 bits et obtenu les résultats souhaités.

Sur la machine 64 bits, le code importe explicitement à partir de la version 64 bits de msado15.dll (v6.1.7600.nnn). La machine a demandé l'application Office Data Providers (AccessDatabaseEngine_x64.exe) pour obtenir les nouveaux pilotes ACE (ACEODBC.DLL, v14.nnn.nnn.nnn). Si je regarde la source de données sous l'administrateur Outils (je sais que ODBC n'est pas le même que ADO, c'était juste pour confirmer que la DLL était installé correctement), il montre la DLL attendue.

Je peux même confirmer, en utilisant Process Explorer, que la version de msado15.dll il charge au moment de l'exécution (confirmant ainsi que COM est de trouver le dll ADO) est la version 64 bits.

Je crois que nous avons installé MDAC 2.8 (nous avons msado28.tlb au même endroit que msado15.dll, mais qui aurait pu être installé par AccessDatabaseEngine_x64.exe).

La machine de test est Windows 7 Ultimate, 64 bits. Le code de test a été recompilé sur cette machine en utilisant VS2008 pour x64 en version complète et exécuté en externe.

Et pourtant, nous obtenons toujours l'erreur COM 0x800a0e7a (fournisseur non trouvé).

Y at-il quelqu'un peut suggérer pourquoi cela ne fonctionne pas, ou ce que autres tests/contrôles je peux effectuer pour vérifier que j'ai toutes les bonnes choses sur la machine (et donc, qu'il devrait travail)?

Je sais que ODBC fonctionnera sous x64 (essayé le programme de test en utilisant cela) mais réécrire notre base de code pour ODBC serait indésirable!

+0

Est-ce vous êtes sûr que les composants 64 bits sont correctement enregistrés? –

+0

Malheureusement, je ne peux pas le dire. J'ai trouvé le répertoire avec l'as *.fichiers dll dedans, mais regsvr32 ne fonctionne pas sur eux. Ils pourraient être des assemblées interopérables, ne peuvent pas se rappeler comment les réenregistrer. J'ai jeté un oeil dans le registre et peut trouver HKLM \ Software \ Microsoft \ Office \ 14.0 \ et un tas de clés et de sous-clés, y compris "Access Connectivity Engine", mais il n'est pas clair lequel implémenterait ADO. Je peux seulement supposer que le fait que ces clés existent et les sources de données ODBC mentionnent ces DLL dans la liste des pilotes de source de données, qu'ils * sont * enregistrés. – JTeagle

+0

Y a-t-il un regsvr64? –

Répondre

2
("Provider=Microsoft.ACE.OLEDB.14.0;") 

L'une des choses, il peut y avoir d'autres,

En dépit d'être le bureau 14 version que vous devez toujours utiliser l'Office 12 référence pour le fournisseur

-à-dire

("Provider=Microsoft.ACE.OLEDB.12.0;")