Zugriff auf Access-Datenbank
-
Hi!
Ich habdas Forum und die FAQ durchstöbert, viel gefunden, nix was hiflreich wäre!
Ich hab eine Access-Datenbank mit 4 Tabellen.
Über ein TDatabase Objekt stelle ich (hoffentlich richtig) die verbindung her.EInstellungen:
AliasName
Connected false
DatabaseName MeineDatenbank.mdb
DriverName Microsoft Access Driver(*.mdb)
Exclusive false
HandleShared false
KeepConnection true
LoginPromt false
Name Database1
ReadOnly true
SessionName Default
Tag 0
TransIsolation tiReadCommittedSo.
Im FormCreate ruf ich meine Funktion LoadDatabase aufLoadDatabase(Database1,"Access","","");
Die Funktion:
void TForm1:: LoadDatabase(TDatabase *DB,const AnsiString Alias,const AnsiString User, const AnsiString Password) { DB->DatabaseName=Alias; DB->AliasName=Alias; DB->Params->Values["USER"]=User; DB->Params->Values["PASSWORD"]=Password; }
So.
Wie sehe ich jetzt ob ich erfolgreich verbunden bin=??
Wie kann ich jetzt auf die Tabellen zugreifen und wie kann ich abfragen schreiben??Bitte um gute Antworten und keine Brocken.
MfG Puccini (Sorry falls falsches Forum, dachte aber gehört eher zu Borland)
-
Welchen BCB verwendest Du, respektive Hast Du die TADO...-Komponenten zur Verfügung?
Damit läßt sich eine Verbindung zu Access einfacher aufbauen.
-
Ich konnte auch die TADO verwenden!
Würdest du mir dazu Hilfestelleung gebn??
Wäre cool.
BCB Version 10.0.2151.25345
-
Hallo,
ich mache es so:
ADODatabase->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=Database.mdb;Mode=Share Deny None;Extended Properties="";Persist Security Info=False;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine T"; ADODatabase->Connected = true; objQuery->Close(); objQuery->SQL->Clear(); objQuery->SQL->Add("Select * from Table where Field = '...'"); objQuery->Open(); while (objQuery->Eof == False) { String sText = objQuery->FieldByName("...")->AsString; lstEntries->Items->Add(sText); objQuery->Next(); } objQuery->Close();
-
He, danke!
Sieht gut aus!
Das pack ich einfach irgendwo in den Code wo ichs grad brauch oder??
Muss ich dazu noch irgendwas imporiteren?Warum das objQuery->Close() zuerst??
-
Hi,
ADOConnection mache ich im Create. Das andere, wenn Du es brauchst bzw. wo Du es brauchst. Kannst auch mit mehreren Querys arbeiten. Zuerst den Close ..? Hab einfach einige Elemente kopiert, brauchst am Anfang natürlich nicht.
-
ADOConnection im Create??
Im FormCreate?Wie muss ich das da anlegen? Standardeinstellung werden da net gehen oder?
Der meckert bei mir rum:
ADODatabase ist undefiniert??Wie soll ich das definieren?
Sorry für die Fragen, aber sicher auch gut für die Nachwelt!MfG Puccini
-
Ja im FormCreate. Du musst aus der Toolbox ADO die beiden Komponenten auf die Form packen: ADOConnection und ADOQuery. Beide entsprechend benennen. Und in der ADOQuery über die Eigenschaften bei Connection den Namen Deiner ADOCOnnection Komponente eintragen.
-
Du brauchst eine TADOConnection (oben irritierenderweise ADODatabase genannt). Am besten den Connection-String erstellen lassen. Aufs Form legen, Doppelklick drauf und auf Aufbauen klicken, danach einfach die passenden Einstellungen wählen.
Für die Abfragen verwendest Du am Besten TADODataSet-Objekte. Diese müssen die ADO-Connection unter Connection angeben und unter CommandText den SQL-Befehl angeben. Falls Du die Daten in einem TDBGrid anzeigen willst, brauchst Du noch ein TDataSource-Objekt für die anzuzeigenden TADODataSet-Objekte. In der DataSource trägst Du unter DataSet das ADODataSet ein. Im DBGrid mußt Du dann das DataSource-Objekt angeben.
Um die Datenbank zu öffnen, mußt Du in der ADOConnection Connected auf true setzen (das kannst Du durchaus im Konstruktor des Forms machen, im Destruktor dann Connected auf false setzen).
Die ADODataSets kannst Du wie oben gezeigt einsetzen (nur das Du nicht Query->SQL->Text setzt, sondern DataSet->CommandText).
Du könntest auch TADOQuery verwenden, aber gerüchteweise heißt es, die TADODataSet-Komponente wäre besser. Ich hab allerdings zu wenig Erfahrung mit den ADO-Komponenten, um das beurteilen zu können. Nur die TADOTable-Komponente solltest Du nicht verwenden. Die ist kaum mehr als ein Marketinggag.
-
ErnstS schrieb:
Ja im FormCreate.
FormCreate sollte man nicht verwenden. Das kann zu Problemen führen. Besser ist es den Konstruktor und Destruktor zu verwenden.
-
Was is denn nun wieder der Konstruktor und Destruktor^^
Sind das auch Events?
Wenn ja find ich die net!
Oder wo muss ich das suchen?
-
Na, da fehlen Dir aber noch ein paar Grundlagen... Was ein Konstruktor und Destruktor ist, MUSST Du wissen, bevor da darüber nachdenken darfst ein Programm zu schreiben.
Für jedes TForm wird Dir z.B. der Konstruktor automatisch erstellt:
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { }
Den Destruktor mußt Du selbst erstellen.
-
^^
sorry, da hatte ich das falsch verstanden
Da hatte ich zuerst alles drin...
Dachte mir dann aber wenn es schon so eine FUnktion OnCreate gibt, pack ich doch alles dort rein ^^aber wenn das fehler verursacht, dann lass ich das lieber wieder!
Einen Destrucktor hab ich mir da auch shcon geschrieben. Erst fang ich ab ob das Fenster geschlossen wird und dann wird meine Funktion aufgerufen.
Danke nochmal für den Tip mit der DB!
Es kommen keine Fehler mehr!
Aber ich hab geschrieben:Abfrage->SQL->Add("Select * From Tabelle1"); while(Abfrage->Eof==false) { tempMemo->Lines->Add(Abfrage->FieldByName("Spalte1")->AsString); Abfrage->Next(); } ADODatabase->Close();
Aber in meinem Memo erscheint nix??
Ich hab auch testhalber voher und nacher Text einfügen lassen, aber dazwischen stand danna uch blos nix!
Woran könnte das liegen??MfG Puccini
-
Puccini schrieb:
aber wenn das fehler verursacht, dann lass ich das lieber wieder!
Es kann Fehler verursachen. Das hängt immer von den Umständen ab, aber mit dem Konstruktor bist Du auf der sicheren Seite.
Puccini schrieb:
Aber in meinem Memo erscheint nix??
Öffnest Du die ADOQuery auch? Außerdem ist es gefährlich einfach Anweisungen zu 'adden', ohne vorher sicher zu stellen, dass kein Text mehr drin steht und die Query nicht geöffnet ist.
if (ADOQuery1->Active) ADOQuery1->Close(); ADOQuery1->SQL->Clear(); ADOQuery1->SQL->Add("SELECT..."); // oder statt der beiden oberen Zeilen // ADOQuery1->SQL->Text = "SELECT..."; ADOQuery1->Open(); // dann hier weiter mit der while-Schleife ADOQuery1->Close();
-
THX!
Das Open hats gerissen!
Jetzt geht alles.!
Klasse
Vielen dank nochmals für die Hilfe!