2011-07-01 16 views
5

Mam dwa krótkie pytania dotyczące importowania i używania ADO w projekcie C++. Nie mam doświadczenia z ADO w żadnej formie.C++ importowanie i używanie ADO

Po pierwsze, na razie aspekt bazy danych mojego programu musi działać tylko w systemie Windows. Czy wystarczy przetestować _WIN32 lub _WIN64 przed uruchomieniem specyficznego kodu ADO lub czy istnieją lepsze podejścia? Używam Visual C++ 2010 Express jako mojego kompilatora.

Po drugie, podążam za this page jako moim przewodnikiem. Dodałem instrukcję #import dla msado15.dll. Dyrektywa #import jest podkreślona na czerwono, a błąd, który otrzymuję po najechaniu na niego, mówi "... nie można otworzyć ścieżki pliku źródłowego/do/msado15.tlh", a wszelkie obiekty ADO, które kopiuję do źródła, pozostają czerwone podkreślone. Sprawdziłem katalog wymieniony w komunikacie o błędzie i msado15.tlh tam jest, jeśli to ma znaczenie. Program kompiluje się (zawiesza się po uruchomieniu, ale to jest coś innego, co osobiście zdiagnozuję).

Nie mam pojęcia, dlaczego tak się dzieje. Każda pomoc lub porada będą mile widziane.

+0

Czy twój komputer ma 32-bit lub 64-bitowy? Jeśli 64-bitowe, musisz wskazać Program Files (x86) – crashmstr

+0

Proszę odnieść się do: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

+0

Proszę odnieść się do: https://stackoverflow.com/questions/42036189/msado15-tlh-not-generated-after-importing-msado15-dll/46540869#46540869 – Kamleshwar

Odpowiedz

9

Sposób, w jaki to zrobić, możemy dodać następujące z VC++ katalogi/zawierać pliki

$(ProgramFiles)\Common Files\System\ado 

a potem importować jak ten

w nagłówku:

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

At górna część pliku cpp

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

Trochę inaczej, ponieważ wolimy zachować przestrzeń nazw i używać innej nazwy EOF.

C++ Import help on MSDN

C++ Import Attributes on MSDN

+0

Nigdy nie wiedziałem o 'no_implementation' i' implementation_only'. Myślę, że jest to bardzo przyjemny sposób obsługi, dzięki czemu pliki nagłówkowe są znacznie lżejsze, a nie przeciągają się wraz z pełną implementacją ADO, gdy zostaną uwzględnione. –

+0

Mam podobny problem, próbowałem wszystkich tych poprawek i to nie działa.Zgadzam się jednak, że te rozwiązania powinny działać w nowym projekcie. Po prostu zgaduję, że VS 2010 ma trochę problemów z msado15.dll. Przekształciłem projekt z VS 2003 na rok 2010 i kiedy próbuję go skompilować, wygenerowany plik tbl zawiera błąd związany z symbolem EOF. Wygląda na to, że kompilator nie kupuje substytucji makra nazwy. Mam temat tutaj http://stackoverflow.com/questions/16715900/converting-application-from-visual-studio-2003-to-visual-studio-2010-ado-c. Dzięki! – zlogdan

+0

Czy na pewno to działa? devenv.exe to aplikacja 32-bitowa, dlatego zmienna środowiskowa $ (Program Files) zawsze wskazuje na folder 32-bitowy. – Bathsheba

2

miałem ten sam problem, kiedy zacząłem z ADO. (czerwony podkreślony, nie mogę znaleźć ...) To doprowadziło mnie do szaleństwa, ale po prostym skompletowaniu podkreślenie zniknęło i wszystko działało dobrze.

Używam #import "C:\Program\Delade filer\System\ado\msado15.dll" rename_namespace("USEADO"),rename("EOF","EndOfFile") w moim nagłówku.

w CPP np:

#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;  } 

jestem nie ekspertem w C++, ale to działa dobrze dla mnie. Mam nadzieję, że ci to pomoże. Jeśli ktoś tutaj ma sugestie/krytykę powyższego fragmentu, czekam na niego ...