Schlichte ADO Verbindung zu Access?



  • Hallo,

    ich versuche schon seit geraumer Zeit Access-Tabellen über VC++ abzufragen, aber es klappt nicht. Nun habe ich mich dazu entschlossen dies über ADO zu machen da es hier wenigstens etwas Doku gibt.
    Nun aber mein Problem:

    Wie Connecte ich denn zu der Datenbank bzw. dann der Tabelle?

    ::CoInitialize(NULL);	
    
    _ConnectionPtr pConn;
    pConn.CreateInstance(__uuidof(Connection));
    pConn->Open(L"Provider=SQLOLEDB.1;Data Source=C:/usr/projects/Access/Ado1/NaviDatabase.mdb", L"", L"", adOpenUnspecified);
    

    Aber ich bekomme dann bei dem Open "Unbehandelte Ausnahme in AdoTestDiag2.exe (Kernell.dll):0xE06D7363: Microsoft c++ exception".
    Was ist denn nun Falsch? Ich versteh das nicht 😢

    Hoffe mir kann jemand helfen, ich verzweifel daran 😡



  • Hi. Ich weiß nicht ob du das Buch Visual C++ in 21 Tagen kenst, wenn nicht könnte ich dir ein ganzes kapitel zu dem Thema als HTMLDokument schicken.
    Gruß maziarz



  • ADO?
    Warum nutzt du nicht die Möglichkeit einer ODBC-Datenbankanbindung.
    CRecordset...
    ODBC ist relativ fortschrittlich, es gibt zahlreiche Dokumentationen, Quelltext, FAQ's, etc. allein hier im Forum.

    Gruß
    RunSeb 😉



  • Hallo vielen Dank,
    aber genau nach dem Buch habe ich es inzwischen versucht zu machen, aber das geht nicht 😢 Und ich weiß nicht wieso. Ich habe VC++ Enterprise Edition, also an der VC++ VErsion sollte es wohl nicht liegen

    zu ODBC: Also soweit ich mich inzwischen schlau gemacht habe ist ODBC eigentlich veraltet und es wird nach und nach durch ADO ersetzt. Zudem habe ich auch schon gehört, daß ADO schneller ist. Aber so richtig durchblicken tu ich bei dem ganzen Durcheinander nicht da das ja irgendwie alles zusammenhängt.



  • Hallo,

    Also erst mal mußt Du beim aufruf der .mdb \ und nicht / benützen (Windows nicht Unix).
    Dann anstatt \ ein \.

    Ich mache es immer so:

    #import "D:\Programme\Gemeinsame Dateien\System\ado\msado15.dll" rename("EOF","ADOEOF")
    

    einbinden, dann:

    HRESULT hr;
        CoInitialize(NULL);
        try
        {
            ADODB::_ConnectionPtr connection;
            // COM Komponente Connection initialisieren
    		hr = connection.CreateInstance(__uuidof(ADODB::Connection));
            if (FAILED(hr))
            {
                throw _com_error(hr);
            }
    		// COM Komponente Recordset initialisieren
            ADODB::_RecordsetPtr recordset;
            hr = recordset.CreateInstance(__uuidof(ADODB::Recordset));
            if (FAILED(hr))
            {
                throw _com_error(hr);
            }
    
    		// DB öffnen
    		/*
    		DB Typ	= MS Access 2000 -> Provider=Microsoft.Jet.OLEDB.4.0 
    		DB File	= Nordwind.mdb	 -> Data Source=Nordwind.mdb (im Projektverzeichnis) 
    		Siehe hierzu auch: MS ACCESS Online Hilfe, Stichwort "ADO"
    		Soll auf einen anderen DB Typ zugegriffen werden (SQL Server, ORACLE etc ... ),
    		dann in der dortigen Doku den Connection String nachsehen 
    		*/
    		cout << "Oeffne DB ... " << endl;
            connection->Open(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Nordwind.mdb;"
            L"", L"", L"", ADODB::adConnectUnspecified);
    		cout << "DB geoeffnet ... " << endl;
    		recordset->Open("SELECT * FROM meineTabelle;",
            connection.GetInterfacePtr(),
            ADODB::adOpenForwardOnly, ADODB::adLockReadOnly,
            ADODB::adCmdText);
            while(!recordset->ADOEOF)
            {
                _variant_t var;
                var = recordset->Fields->GetItem(L"name")->GetValue();
                std::cout << static_cast<std::string>(_bstr_t(var.bstrVal))
                << std::endl;
                recordset->MoveNext();
            };
            recordset->Close();
            connection->Close();
    
        }
        catch(_com_error &e)
        {
    		std::cout << "Fehler beim DB-Zugriff" << endl;
    		std::cout << hr << ":"
    			<< static_cast<std::string>(e.Description());
        }
        catch(...)
        {
            std::cout << "Unbekannte Exception";
        };
    

    Gruß
    andy_mann



  • @andy_mann:
    danke das war etwas Brauchbares *g*

    Noch ein paar Fragen:

    ->Open(L"Provider=Microsoft.Jet.OLEDB.4.0; .....
    

    Was bedeutet das? Ist es denn nun noch ADO oder ist es eine Jet Verbindung? Ich blicke die Zusammenhänge da nicht so ganz. Welchen "Provider" nehme ich denn am besten, ich habe ja noch andere Möglichkeiten oder?

    var = recordset->Fields->GetItem(L"name")->GetValue();
    

    Muß ich nun wirklich auf diese Weise jedes Feld einzeln auslesen? Denn da muß ich meine ganzen SQL Angaben (Select Tabelle.VorName, Tabelle.Alter, Tabelle.Wohnort,....) im Prinzip nochmal angeben.Geht das nicht ein wenig.. ähh.. dynamischer?



  • Hallo,

    1. ADO bildet die Schnittstelle zwischen deinem Programm und in diesem Fall der Jet Schnittstelle zu deinem Betriebssystem. Deswegen brauchst Du auch die msado15.dll. Benötigst Du eine andere Schnittstelle, mußt du den Provider wechseln. Dazu solltest Du aber die Hilfestellung lesen, wie oben beschrieben.

    2. Was möchtest Du da Dynamischer gestallten ?
    Wenn Du eine Tabelle, ein Feld in der Datenbank hast brauchst Du jemweils eine Anweisung. Du könntest allerdings mittels Schleiffe die Colums auslesen und anschließend die Felder un der Columanzahl ausgeben.

    Gruß
    andy_mann


Anmelden zum Antworten