Blueeye Geschrieben 16. April 2002 Geschrieben 16. April 2002 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 Zitieren
Klotzkopp Geschrieben 16. April 2002 Geschrieben 16. April 2002 ADO ohne MFC hatten wir schon mal, vielleicht hilft Dir der Link in diesem Thread auch: http://fachinformatiker-world.de/forums/showthread.php?s=&threadid=18945 Zitieren
Blueeye Geschrieben 16. April 2002 Autor Geschrieben 16. April 2002 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? Zitieren
Klotzkopp Geschrieben 16. April 2002 Geschrieben 16. April 2002 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? Zitieren
Blueeye Geschrieben 16. April 2002 Autor Geschrieben 16. April 2002 Ja! struct InitOle { InitOle() { ::CoInitialize(NULL); } ~InitOle() { ::CoUninitialize(); } } _init_InitOle_; Zitieren
Klotzkopp Geschrieben 16. April 2002 Geschrieben 16. April 2002 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. Zitieren
Blueeye Geschrieben 18. April 2002 Autor Geschrieben 18. April 2002 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? Zitieren
Klotzkopp Geschrieben 18. April 2002 Geschrieben 18. April 2002 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); Zitieren
Blueeye Geschrieben 18. April 2002 Autor Geschrieben 18. April 2002 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": Zitieren
Klotzkopp Geschrieben 18. April 2002 Geschrieben 18. April 2002 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. Zitieren
Blueeye Geschrieben 18. April 2002 Autor Geschrieben 18. April 2002 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? Zitieren
Klotzkopp Geschrieben 18. April 2002 Geschrieben 18. April 2002 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. Zitieren
Blueeye Geschrieben 18. April 2002 Autor Geschrieben 18. April 2002 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? Zitieren
Klotzkopp Geschrieben 18. April 2002 Geschrieben 18. April 2002 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] Zitieren
Blueeye Geschrieben 18. April 2002 Autor Geschrieben 18. April 2002 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"); Zitieren
Empfohlene Beiträge
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.