Datenbank-Connection komplett über Sourcen
-
Hi,
ich greife über ODBC auf eine Datenbank zu. Da ich ungern über Komponenten arbeite, schreibe ich die Zugriffe selbst.
Der Verbindungsaufbau zur DB geschieht über TDatabase. Nur jetzt würde ich gerne alle anderen Objekte (z.B. Abfragen mit TQuery) über diese Connection laufen lassen. Muss jedes Objekt mit den Login-Infos, DSN etc. gefüttert werden, damit das funktioniert?
Ich benutze BCB 5
-
Suchst du das hier?
qryQuery->DatabaseName = dbDatenbank->DatabaseName;Oben der Code sollte für TDatabase passen. Der hier ist analog für TADOConnection:
qryQuery->Connection = dbDatenbank;
-
Da kommt eine Fehlermeldung "Unbekannte Datenbank".
Wenn ich allerdings den AliasName angebe klappt es. Das Problem ist nur, dass er den LoginPrompt erneut anzeigt und das möchte ich ja unter anderem verhindern.
-
Ich poste mal meine Klasse.
Der Connect funktioniert. Die Query nicht (Fehler tritt beim ExecSQL auf).DBHandler::DBHandler( TComponent *Owner, String OdbcDsn, String DatabaseName, String SessionName, String Username, String Password) { /* * Membervariablen initialisieren */ this->DatabaseName = DatabaseName; this->SessionName = SessionName; this->Username = Username; this->Password = Password; this->Owner = Owner; this->OdbcDsn = OdbcDsn; /* * Verbindungsparameter der Datenbank setzen */ DB = new TDatabase(Owner); DB->AliasName = OdbcDsn; DB->DatabaseName = DatabaseName; DB->Exclusive = false; DB->HandleShared = false; DB->KeepConnection = true; DB->LoginPrompt = false; DB->Name = "MyDatabase"; DB->ReadOnly = false; DB->SessionName = SessionName; DB->Tag = 0; DB->TransIsolation = tiReadCommitted; TStringList *MyStringList = new TStringList; MyStringList->Add("USER NAME="+Username); MyStringList->Add("PASSWORD="+Password); DB->Params = MyStringList; /* * Abfrage-Objekt erstellen und mit Datenbank verbinden */ query = new TQuery(Owner); // PROBLEMZONE query->DatabaseName = DB->AliasName; } bool DBHandler::Connect() { // Wenn die Sitzung existiert, diese aktivieren, // andernfalls neue Sitzung erstellen. Sessions->OpenSession(SessionName); TSession *pSession = Sessions->FindSession(SessionName); TDatabase *TempDatabase = pSession->FindDatabase(DatabaseName); // Ist die Datenbankkomponente bereits vorhanden, dann einfach diese zurückgeben if (TempDatabase) return TempDatabase; // Neue Datenbankkomponente erstellen. try { DB->Connected = true; return true; } catch (const Exception &e) { delete DB; Application->MessageBox( e.Message.c_str(), "Fehler", 16 ); return false; } } void DBHandler::Disconnect() { if( DB ){ DB->Connected = false; delete DB; } } void DBHandler::Query(String Stmt) { query->Close(); query->SQL->Clear(); query->SQL->Add("insert into provider(name,netz) values(:name,:netz)"); query->ParamByName("name")->Value = "bla"; query->ParamByName("netz")->Value = "narf"; query->ExecSQL(); //return query; }
-
LoginPrompt = false;Zum Test empfehle ich dir eine Komponente auf dem Formalur anzulegen und die Properties direkt im Objektinspektor einzugeben. Wenn das dann funktioniert kannst du es im Quellcode formulieren.
-
Ich denke
query->DatabaseName = DB->AliasName;ist falsch.
Eher so:
query->DatabaseName = DB->DatabaseName;
-
Da kommt der o.g. Fehler.
Kann ich den Komponenten nicht irgendwie den Datenbankpointer übergeben?
Weil wenn ich überall nur den Namen selbst (AnsiString) übergeben kann, muss ja jede Komponente selbst eine Verbindung aufbauen.
-
Ahhh ich hab ihn....
Die Codezeilen wo mit der Session gearbeitet wird müssen raus, dann gehts.
-
Besten Dank
