[solved] Connection zur DB steht, jedoch hängt sich das Programm (LogIn-Fenster) bei der Query auf
-
Hallo zusammen,
ich programmier im Moment ein kleines Programm, dass ein Hauptformular beinhaltet (in dieser Form1 ist ein DBGrid und DBEdit-Felder vorhanden)
und eine Form2 das ein Login-Fenster darstellen soll.In Oracle gibt es zwei Datenbanken. Diese heißen Global und Data.
Ich habe eine OraSession (OraSession1) an die Form2 gebunden die mit der DB Data gekoppelt ist.
Die Daten zum Verbindungsaufbau habe ich direkt in die Komponente eingegeben.Das Login-Fenster besitzt eine seperate OrSession(OraSession2), die mit der Golbal-DB verbunden ist.
Auch hier wurden die Daten in die Komponente übertragen.Der Code sieht wie folgt aus;
void __fastcall TForm2::FormCreate(TObject *Sender) { npQuery = new TSmartQuery(OraSession1); Form2->Visible = true; } //--------------------------------------------------------------------------- void __fastcall TForm2::ButtonAnmeldenClick(TObject *Sender) { String Benutzer = Edit1->Text.UpperCase(); String Passwort = Edit2->Text; LoginBenutzer(npQuery, Benutzer, Passwort ); } //--------------------------------------------------------------------------- bool TForm2::PruefeGruppe(TSmartQuery *pQuery, String User) { bool lbRet; String Gruppenberechtigung; String s = "SELECT GRUPPE From GLOBAL_BENUTZER WHERE BENUTZER = " "'" +User+ "'" ""; Query(pQuery, s); if (0 < pQuery->RecordCount) { Gruppenberechtigung = pQuery->FieldByName("GRUPPE")->AsString; if (Gruppenberechtigung == "Administratoren") { Form1->DBEdit1->Enabled = true; Form1->DBEdit2->Enabled = true; Form1->DBEdit4->Enabled = true; Form1->DBEdit1->Enabled = true; lbRet = true; } else { Form1->DBEdit1->Enabled = false; Form1->DBEdit2->Enabled = false; Form1->DBEdit4->Enabled = false; Form1->DBEdit1->Enabled = false; lbRet = true; } } else { lbRet = false; } return lbRet; } //--------------------------------------------------------------------------- void __fastcall TForm2::Query(TSmartQuery *nQuery, String Parameter) { nQuery->Close(); nQuery->SQL->Clear(); nQuery->SQL->Add(Parameter); nQuery->Execute(); } //--------------------------------------------------------------------------- void __fastcall TForm2::LoginBenutzer(TSmartQuery *nQuery, String User, String PW) { if ( (PruefeBenutzer(nQuery, User, PW) == true) && (PruefeGruppe(nQuery, User) == true)) { Form1->Visible = true; Form3->Visible = false; } else { ShowMessage ("Benutzer: "+User+" nicht vorhanden oder Passwort falsch!"); } } //--------------------------------------------------------------------------- bool TForm2::PruefeBenutzer(TSmartQuery *pQuery, String User, String PW) { bool lbRet; String AnmeldePW; String CodedPW; String s = "SELECT PASSWORT From GLOBAL_BENUTZER WHERE MFBE_BENUTZER =" "'" +User+ "'" ""; Query(pQuery, s); if ( 0 < pQuery->RecordCount ) { AnmeldePW = pQuery->FieldByName("PASSWORT")->AsString; CodedPW = SystemFunkCodierePasswort(PW); if ( AnmeldePW == CodedPW ) { ShowMessage( "Benutzer:"+User+" ist angemelder!" ); lbRet = true; } else { lbRet = false; } } else { lbRet = false; } return lbRet; } //--------------------------------------------------------------------------- String TForm2::SystemFunkCodierePasswort(String sPasswort) { String sCodiertesPasswort; int iZaehler, iZeichen; sCodiertesPasswort = ""; for(iZaehler = 1; iZaehler <= sPasswort.Length(); iZaehler++) { iZeichen = (int)sPasswort[iZaehler]; sCodiertesPasswort = sCodiertesPasswort + String(2 * iZeichen); } return sCodiertesPasswort; } //---------------------------------------------------------------------------
Die Header-Datei sieht so aus;
class TForm2 : public TForm { __published: // IDE-verwaltete Komponenten TLabel *Label1; TLabel *Label2; TEdit *Edit1; TEdit *Edit2; TButton *ButtonAnmelden; TOraSession *OraSession1; void __fastcall FormCreate(TObject *Sender); void __fastcall ButtonAnmeldenClick(TObject *Sender); private: // Benutzer-Deklarationen TSmartQuery *npQuery; public: // Benutzer-Deklarationen String SystemFunkCodierePasswort(String sPasswort); bool PruefeBenutzer (TSmartQuery *pQuery, String User, String PW); bool PruefeGruppe(TSmartQuery *pQuery, String User); void __fastcall LoginBenutzer(TSmartQuery *nQuery, String User, String PW); void __fastcall Query(TSmartQuery *nQuery, String Parameter); __fastcall TForm2(TComponent* Owner); };
Das Programm springt also bei Betätigung des Buttons in die Methode LoginBenutzer. Von hier werden die beiden Methoden zur Prüfung der Gruppenberechtigung und des Benutzers getätigt. Erst, wenn diese beiden true sind, schließt sich das Login-Fenster und das Hauptprogramm(Form1)öffnet sich.
Mein Problem hierbei ist, dass ich, sobald ich in die Methode PruefeBenutzer komme den SQL-String an die Query übergebe, hängt sich die Query beim Execute auf.
Die Fehlermeldung ist dann "Tabelle oder View nicht vorhanden". Dies kann aber nicht sein, da ich erstens die Tabelle im SQL-Developer sehen kann. Zweitens habe ich ein kleines Test-Programm geschrieben (was größtenteils aus copy paste besteht). Im Test-Programm ist das Login-Fenster die Form1 und in Form2 sind testweise Edit-Felder integriert, die ich erfolgreich enable und disablen kann.
Das Test-Programm läuft ohne Probleme.
Ich versteh absolut nicht warum. Meines Erachtens habe ich nichts übersehen.
Warum will das Test-Programm und das Hauptprogramm nicht obwohl sie fast komplett gleich sind.Für eure Hilfe danke ich euch vielmals im voraus !
P.S. Ich weiß der Code ist sehr einfach gestrikt, fange aber gerade erst an mit dem C++ Builder zu arbeiten.
-
Hat sich erledigt, habe es hinbekommen!