Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi Leute,

habe es nicht ganz hinbekommen einen Logintest mit MFC zu realisieren(siehe "Variabler Datenbankzugriff mit ADO unter MFC" vom 08.04.02).

Ich will jetzt das ganze ohne MFC realisieren, so das ich eine .exe ausführe, die mir dann ausgibt, ob eine Verbindung zu der Datenbank besteht oder nicht. Mehr soll das Programm nicht machen. Ich suche gerade eine Möglichkeit, mit der dies am einfachsten zu realisieren ist. Das Resultat des Programms kann auch in der Eingabeaufforderung ausgegeben werden. Der Zugriff erfolgt ausschließlich auf Oracle-Datenbanken. Wär nett, wenn Ihr mir dazu ein wenig INPUT geben könntet.

Vielen Dank im Vorraus

Pistol2408

Geschrieben

Mache es jetzt folgender Maßen:


#include <windows.h>

#include <initguid.h>  // Include only once in your application

#include "adoid.h"     // ADO GUID's

#include "adoint.h"    // ADO Classes, enums, etc.


struct InitOle {

InitOle()  { ::CoInitialize(NULL); }

~InitOle() { ::CoUninitialize();   }

} _init_InitOle_;


void main()

{

    HRESULT         hr  = S_OK;

    ADORecordset*   Rs1 = NULL;

    VARIANT         Source;

    VARIANT         Connect;


    VariantInit( &Source  );

    VariantInit( &Connect );


    Source.vt       = VT_BSTR;

    Source.bstrVal  = ::SysAllocString( L"SELECT * FROM table");


    Connect.vt      = VT_BSTR;

    Connect.bstrVal = ::SysAllocString( L"Provider=MSDAORA.1;Password = pass; User ID = user; Data Source= host;" );


	//Provider=MSDAORA.1;Password = pass; User ID = user; Data Source= host; Persist Security Info=True


    hr = CoCreateInstance( CLSID_CADORecordset, 

                           NULL, 

                           CLSCTX_INPROC_SERVER, 

                           IID_IADORecordset, 

                           (LPVOID *) &Rs1 );


    if( SUCCEEDED( hr ) ) hr = Rs1->Open( Source,

                                          Connect,

                                          adOpenForwardOnly, 

                                          adLockReadOnly, 

                                          -1 );

    if( SUCCEEDED( hr ) ) hr = Rs1->Close();

    if( SUCCEEDED( hr ) ) { Rs1->Release();  Rs1 = NULL; }

    if( SUCCEEDED( hr ) ) ::MessageBox( NULL, "Success!", "", MB_OK );

}

Bekomme im Debuger folgende Meldung:

this CXX0017: Error: symbol "this" not found

Erkennt einer von euch das Problem?

Geschrieben
Original geschrieben von Pistol2408

this CXX0017: Error: symbol "this" not found

Erkennt einer von euch das Problem?

Naja, wenn Du keine Klasse hast, sondern nur statische (oder globale) Methoden wie main, dann hast Du natürlich keinen this-Pointer. Wenn das Symbol in deinem Code nicht vorkommt, dann ist es auch kein Fehler.

Aber was anderes: Hast Du CoInitialize aufgerufen?

Geschrieben

Sorry, das mit der Struct hatte ich übersehen.

Bau doch mal else-Blöcke in die SUCCEEDED-Abfragen ein, damit Du sieht, an welcher Stelle er aussteigt.

Noch was: Das Release solltest Du vom erfolgreichen CoCreateInstance abhängig machen, nicht vom erfolgreichen Close.

Geschrieben

Habe meinen Quellcode jetzt geändert!

Bekomme nun aber eine andere Fehlermeldung, mit der ich nichts anfangen kann. Hier erstmal mein Quellcode:


#include <stdio.h>

#include <afxdisp.h>


#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" rename ("EOF","adoEOF") no_namespace


#define CREATEiNSTANCE(sp,riid) { HRESULT _hr =sp .CreateInstance( __uuidof( riid ) ); \

                                  if (FAILED(_hr)) _com_issue_error(_hr); }


#define RsITEM(rs,x) rs->Fields->Item[_variant_t(x)]->Value

#define UC (char *)

struct InitOle {

    InitOle()  { ::CoInitialize(NULL); }

    ~InitOle() { ::CoUninitialize();   }

} _init_InitOle_;       // Global Instance to force load/unload of OLE


void main()

{

    _RecordsetPtr   spRS;

    _ConnectionPtr  spCON;

    try{


        CREATEiNSTANCE(spCON,Connection);

        spCON->ConnectionString = L"Provider=MSDAORA.1; Password =pass;"

                                  L"User ID = user; Data Source = host;Persist Security Info=True;"; 

        spCON->Open( "", "", "", -1 );

        CREATEiNSTANCE(spRS,Recordset) 

        spRS->PutRefActiveConnection( spCON );

        spRS->Open("select * from table", vtMissing, adOpenKeyset,

                    adLockBatchOptimistic, -1);


        /*while(spRS->adoEOF == false){

            printf("au_lname = %s  au_fname = %s \n", UC _bstr_t(RsITEM(spRS,0L)),

                                                 UC _bstr_t(RsITEM(spRS,"au_fname")));

            spRS->MoveNext();

        }*/


        spRS->Close();

        spCON->Close();


    }

    catch( _com_error &e){

        _bstr_t bstrSource(e.Source());

        _bstr_t bs =  _bstr_t(" Error: ") + _bstr_t(e.Error()) + _bstr_t(" Msg: ") 

            + _bstr_t(e.ErrorMessage()) + _bstr_t(" Description: ") 

            + _bstr_t(e.Description());


        MessageBox(0,bs,bstrSource, MB_OK);

    }           

}

#undef UC

Bekomme folgende Fehlermeldung vom "Microsoft OLE DB Provider for Oracle":

Error: -2147217900 Msg: IDispatch error #3092 Description: ORA-00906: Linke Klammer fehlt

Kann mir da jemand helfen?

Geschrieben

Wiederum wäre es gut zu wissen, welche Zeile den Fehler produziert...

So weit ich weiß, musst Du ein _Recordset nicht erzeugen, sondern _Connection.Execute liefert Dir eins zurück (wenn der SQL-String Rows liefert).

Die TypeLib sagt:

[id(0x00000006), helpcontext(0x0012c8cc)]

HRESULT Execute(

[in] BSTR CommandText,

[out, optional] VARIANT* RecordsAffected,

[in, optional, defaultvalue(-1)] long Options,

[out, retval] _Recordset** ppiRset);

Geschrieben

Das ist ja eben mein Problem. Ich bekomme keine Zeilenangabe.

Es öffnet sich eine MessageBox mit dem Title "Microsoft OLE DB Provider for Oracle" und der Fehlermeldung "Error: -2147217900 Msg: IDispatch error #3092 Description: ORA-00906: Linke Klammer fehlt":

Geschrieben
Original geschrieben von Pistol2408

Das ist ja eben mein Problem. Ich bekomme keine Zeilenangabe.

Na dann bemüh' doch mal den Debugger. Oder mach ein paar printfs rein. Dann siehst Du, bei welcher Anweisung das Programm in den catch-Block springt.

Geschrieben

Habe den Fehler behoben. Vielen Dank für die Hilfe.

Gibt es auch eine Möglichkeit, sich auf eine Datenbank einzuloggen, ohne ein SQL-Statement mitliefern zu müssen?

Will dem Benutzer ausgeben, das die Verbindung zur Datenbank erfolgreich war. Wie kann ich das abfragen?

Geschrieben
Original geschrieben von Pistol2408

Habe den Fehler behoben. Vielen Dank für die Hilfe.

Sagst Du uns auch, was es war? Lass uns nicht dumm sterben ;)

Gibt es auch eine Möglichkeit, sich auf eine Datenbank einzuloggen, ohne ein SQL-Statement mitliefern zu müssen?

Eigentlich sollte _Connection.Open bereits fehlschlagen, wenn die Datenbank nicht da ist. Probiers doch mal aus.

Will dem Benutzer ausgeben, das die Verbindung zur Datenbank erfolgreich war. Wie kann ich das abfragen?

Wie wäre es mit einem Flag? Du belegst es mit true vor, setzt es im catch-Block auf false, und wenn es nach dem catch-Block noch true ist, dann hat alles funktioniert.
Geschrieben

Der Fehler war ziemlich dumm! Die Tabellen wurden bei uns in der Firma geändert, nur hatte mich keiner davon unterrichtet und keinem ist der Fehler aufgefallen. Tut mir Leid das ich euch deswegen so genervt habe. Deshalb nochmal ´nen dickes DANKE!!!

Wie wäre es mit einem Flag? Du belegst es mit true vor, setzt es im catch-Block auf false, und wenn es nach dem catch-Block noch true ist, dann hat alles funktioniert.

Sorry, aber da versteh ich nur Bahnhof. Hast du vielleicht ein Beispiel?

Geschrieben

void main()
{
_RecordsetPtr spRS;
_ConnectionPtr spCON;
bool fAllesKlar = true;
try{
// ...
}
catch( _com_error &e){
// ...
fAllesKlar = false; // irgendwas ging schief
}
if( fAllesKlar ) {
// bitte jubeln Sie jetzt
}
}
[/CODE]

Geschrieben

ALLES KLAR! Dat funzt! Danke!

Lese die Benutzerdaten aus einer ini-Datei aus. Was muss ich im Pfad angeben, wenn die ini-Datei im selben Verzeichnis wie die .exe liegt? Will den Pfad nicht vorgeben müssen.

Momentan sieht das so aus:

GetPrivateProfileString("daten", "user", NULL, user , 250, "C:\\ini\\test.ini");

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...