Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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?

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?

Ja!

struct InitOle {

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

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

} _init_InitOle_;

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.

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?

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);

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":

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?

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.

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?

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");

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.