2011-07-01 24 views
5

Tengo dos preguntas breves sobre la importación y el uso de ADO en un proyecto de C++. No tengo experiencia con ADO en ninguna forma.C++ importando y utilizando ADO

En primer lugar, por el momento, el aspecto de la base de datos de mi programa solo necesita ejecutarse en Windows. ¿Es suficiente probar si _WIN32 o _WIN64 están definidos antes de ejecutar el código específico de ADO, o hay mejores enfoques? Estoy usando Visual C++ 2010 Express como mi compilador.

En segundo lugar, estoy siguiendo this page como mi guía. He incluido la instrucción # import para msado15.dll. La directiva #import está subrayada en rojo, y el error que recibo al pasar el cursor sobre ella dice "... no puedo abrir la ruta del archivo fuente/a/msado15.tlh" y cualquier elemento ADO que copie en la fuente permanece subrayado en rojo. He revisado el directorio que figura en el mensaje de error y msado15.tlh está allí, si eso es importante. Además, el programa compila (se bloquea después de la ejecución, pero eso es algo más que diagnosticaré por separado).

No tengo ni idea de por qué sucede esto. Cualquier ayuda o consejo sería apreciado.

+0

¿Su máquina es de 32 bits o 64 bits? Si es de 64 bits, debe apuntar a Archivos de programa (x86) – crashmstr

+0

Consulte lo siguiente: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

+0

Consulte lo siguiente: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

Respuesta

9

La forma en que lo hacemos, añadimos el siguiente a cabo Directorios/VC++ Incluir archivos

$(ProgramFiles)\Common Files\System\ado 

Y luego importamos como esto

en la cabecera:

#import "msado15.dll" rename_namespace("ADO") rename("EOF", "EndOfFile") no_implementation 

En la parte superior del archivo cpp

#import "msado15.dll" rename_namespace("ADO") rename("EOF", "EndOfFile") implementation_only 

Un poco diferente, ya que preferimos mantener el espacio de nombres y utilizar un cambio de nombre EOF diferente.

C++ Import help on MSDN

C++ Import Attributes on MSDN

+0

Nunca supe 'no_implementation' y' implementation_only'. Creo que es una forma muy agradable de manejarlo, haciendo que los archivos de encabezado sean mucho más livianos en lugar de arrastrar a lo largo de la implementación completa de ADO cuando están incluidos. –

+0

Tengo un problema similar, he intentado todas estas correcciones y no funciona.Pero estoy de acuerdo en que estas soluciones deberían funcionar en un nuevo proyecto. Solo estoy adivinando que VS 2010 tiene un problema con msado15.dll. Convertí un proyecto de VS 2003 a 2010 y cada vez que intento compilarlo, el archivo tbl generado tiene un error relacionado con el símbolo EOF. Aparentemente, el compilador no compra la sustitución de macro de cambio de nombre. Tengo un tema aquí http://stackoverflow.com/questions/16715900/converting-application-from-visual-studio-2003-to-visual-studio-2010-ado-c. ¡Gracias! – zlogdan

+0

¿Estás seguro de que esto funciona? devenv.exe es una aplicación de 32 bits, por lo tanto, la variable de entorno $ (Archivos de programa) siempre apunta a la carpeta de 32 bits. – Bathsheba

2

que tenían el mismo problema cuando empecé con ADO. (rojo subrayado, no se puede encontrar ...) Me volvía loco, pero después de simplemente compilar, el subrayado desapareció y todo funcionó bien.

Yo uso #import "C:\Program\Delade filer\System\ado\msado15.dll" rename_namespace("USEADO"),rename("EOF","EndOfFile") en mi encabezado.

En CPP por ejemplo:

#include "stdafx.h" 

int SQLsetInfo(THING *Thing, GADGET *Gadget) 
{ 

HRESULT hr;               
USEADO::_ConnectionPtr connection;         
USEADO::_RecordsetPtr recordset;          

//Initialize COM 
    if(FAILED(hr = CoInitialize(NULL)))       
    { MessageBox(NULL, L"Initialize COM Failed", L"MyProg!",MB_ICONEXCLAMATION |MB_OK); 
     //Do something, eg shut down DB stuff and continue without or exit program 
     //Insert error handeler below 
     return hr;//TODO Ad error handeling see line 149 
    } 

if(FAILED(hr = connection.CreateInstance(__uuidof(USEADO::Connection)))) 
    { MessageBox(NULL, L"Create connection instance Failed", L"MyProg!",MB_ICONEXCLAMATION |MB_OK); 
     //Do something, eg shut down DB stuff and continue without or exit program 
     return hr; 
    } 

if(FAILED(hr = recordset.CreateInstance(__uuidof(USEADO::Recordset)))) 
    { MessageBox(NULL, L"Create recordset instance Failed", L"MyProg!",MB_ICONEXCLAMATION |MB_OK); 
     //Do something, eg shut down DB stuff and continue without or exit program 
     return hr; 
    } 

    connection->CursorLocation = USEADO::adUseServer; //http://dev.mysql.com/tech-resources/articles/vb-cursors-and-locks.html           

    //Try to connect to SQL server 
    try   { connection->Open(L"YOUR CONNECTION STRING", USEADO::adConnectUnspecified); } 
    catch(...) {std::cout << "!!! connection->Open(ConnectionString FAILED !!!" << std::endl;  } 

estoy no un experto en C++, pero esto funciona bien para mí. Espero que te ayude. Si alguien más tiene sugerencias/críticas sobre el fragmento anterior, lo estoy esperando ...

Cuestiones relacionadas