![]() |
Datenbank: MS ACCESS • Version: 2003 • Zugriff über: noch gar nicht... :-(
Delphi 2005 -> MS Access
Hallo.
Ich bin langsam echt am verzweifeln: Ich versuche schon seit ewigkeiten, únter Delphi 2005 einen Zugriff auf eine MS Access (Office XP) DB zu realisieren - ES KLAPPT NICHT! Entweder bekomme ich irgendwelche bescheuerten Fehlermeldung ("Parameter Falsch" oder ähnliches) oder er kann garnicht erst eine Verbindung herstellen... Hab zu Testzwecken extra eine Datenbank mit nur einer Tabelle erstellt, ohne passwort... Kann mir BITTE irgendwer eine Step-by-Step Anleitung mailen oder zumindest einen Link schicken, wie ich zunächst mal die Verbindung zu einer ACCESS DB erstellen kann und anschließend Daten Auslesen und zurückschreiben kann? Danke im Vorraus tyron |
Re: Delphi 2005 -> MS Access
//Mal ne Unit um auf ne Access Db zugreifen zu können, nichtganz fein funktioniert aber
//hoffe es hilft
Delphi-Quellcode:
[edit=Luckie]Boah, 2003 angemeldet und dannkeine Delphi-Tags. :shock: So was sehe ich doch spätestens dann, wenn ich das Posting abgeschickt habe. :roll: Mfg, Luckie[/edit]
unit uCDb;
interface uses System.Collections, System.Data, System.Data.OleDB, System.Web.Mail, System.IO; type CDb = class private conn :OleDBConnection; connstr:String; public function Datenabfrage(abfrage:string;Tabelle:string):DataSet; function Wertrueckgabe(ds:DataSet;Tabelle:string;Spalte:string;i:integer):string; function UpdateDelete(Anfrage:String):string; function GetConnStr():string; procedure SetConnStr(conn:String); function Einzelwertrueckgabe(Anfrage,Tabelle,Spalte:String;i:integer):string; function Login(login,passwd,Tabelle,Spalte:string;ds:DataSet;Nr:integer):string; procedure EMAIL(From,Zu,Subject,Nachricht:String);overload; procedure EMAIL(From,Zu,Subject,Nachricht,Anhang:String);overload; procedure EMAIL(From,Zu,bcc,Subject,Nachricht,Anhang:String);overload; constructor Create();overload; constructor Create(Conn:String);overload; end; implementation constructor CDb.Create; begin inherited Create; connstr:='Provider=Microsoft.Jet.OLEDB.4.0;'+ 'Data Source= db\db1.mdb' end; constructor CDb.Create(Conn:String); begin Self.Create; connstr:=conn; end; procedure CDB.SetConnStr(conn:String); begin connstr:=conn; end; function CDb.GetConnStr():String; begin result:=connstr; end; function CDb.Wertrueckgabe(ds:DataSet;Tabelle:string;Spalte:string;i:integer):string; var dt:DataTable; en:IEnumerator; rw:DataRow; begin dt:=ds.Tables[Tabelle]; en:=dt.Rows.GetEnumerator; rw:=dt.Rows[i]; result:=rw[Spalte].ToString; end; function CDb.UpdateDelete(Anfrage:String):string; var cmd:OleDBCommand; rueckgabe:string; begin conn :=OleDBConnection.Create(connstr); cmd:=OleDBCommand.Create(); cmd.Connection:=conn; cmd.CommandText:=anfrage; try conn.Open; rueckgabe:=cmd.ExecuteNonQuery.ToString; except on ex:Exception do begin rueckgabe:=ex.Message+' '+Anfrage; end; end; conn.Close; result:=rueckgabe; end; function CDb.Datenabfrage(abfrage:string;Tabelle:string):DataSet; var cmdSel:OleDbCommand; da:OleDBDataAdapter; ds:DataSet; begin conn :=OleDBConnection.Create(connstr); cmdSel:=OleDbCommand.Create(abfrage,conn); da :=OleDbDataAdapter.Create(cmdSel); ds :=DataSet.Create(); try conn.Open; da.Fill(ds,Tabelle); conn.Close; except on ex:Exception do end; result:=ds; end; procedure CDB.EMAIL(From,Zu,Subject,Nachricht:String); var m:mailmessage; begin m:=MailMessage.Create; m.From:=From; m.&To:=Zu; m.Subject:=Subject; m.Body:=Nachricht; SmtpMail.Send(m); end; procedure CDB.EMAIL(From,Zu,Subject,Nachricht,Anhang:String); var m:mailmessage; begin m:=MailMessage.Create; m.From:=From; m.&To:=Zu; m.Subject:=Subject; m.Body:=Nachricht; m.Attachments.Add(MailAttachment.Create(Anhang)); SmtpMail.Send(m); end; procedure CDB.EMAIL(From,Zu,bcc,Subject,Nachricht,Anhang:String); var m:mailmessage; begin m:=MailMessage.Create; m.From:=From; m.&To:=Zu; m.&Bcc:=bcc; m.Subject:=Subject; m.Body:=Nachricht; m.Attachments.Add(MailAttachment.Create(Anhang)); SmtpMail.Send(m); end; function CDB.Einzelwertrueckgabe(Anfrage,Tabelle,Spalte:String;i:integer):string; var ds:DataSet; begin ds:=Datenabfrage(Anfrage,Tabelle); result:=Wertrueckgabe(ds,Tabelle,Spalte,i); end; function CDB.Login(login,passwd,Tabelle,Spalte:string;ds:DataSet;Nr:integer):string; begin if (login<>'') and (passwd<>'') then begin try if (passwd=Wertrueckgabe(ds,Tabelle,Spalte,Nr)) then begin result:='True'; end except on ex:Exception do begin result:=ex.ToString; end; end; end; end; end. |
Re: Delphi 2005 -> MS Access
Hallo tyron,
damit wir dir überhaupt helfen können brauchts ein paar mehr Infos. Welche Delphi-2005 (z.B. PE) hast du und was hast du bis jetzt probiert. Gehe ich eigentlich recht in der Annahme das du ein Win32-Prog schreiben willst? |
Re: Delphi 2005 -> MS Access
Aaalso, da hab ich dann doch wohl n Bisschen was vergessen:
- Ja, ich will ein Win32 Prog schreiben - Hab Delphi 2005 Enterprise Edition (noch Trial) und Delphi 2005 "Standard" - Hab alle möglichen manuals probiert, hat aber alles nicht geklappt - Ich komm irgendwie - trotz des Delphi2005 Handbuchs - mit den Delphi items nicht klar: muß ich n item aus "BDE" nehmen (Database)? Odder nen "open Dialog"? Oder n "Data Access" Item??? Gibts denn nirgends ne Step-by-Step Anleitung? - Die Anwendung soll Daten aus einer mdb lesen und auch in diese reinschreiben können. Es müssen keine neuen Tabellen erstellt werden. Es muß theoretisch auch nur eine mdb gelesen werden - also kann man sich theoretisch auch den open-Dialog sparen, oder (auch wenn dieser evtl. später mal nützlich werden könnte)? Mir wäre wichtig zu wissen: - wie greife ich auf die mdb zu - wenn ich diese dann (endlich) geöffnet habe, wie greife ich auf tabellen bzw. Ihalte zu - wie schreibe ich in die DB - wie speicher ich dann Änderungen ab Danke im vorraus. Tyron P.S.: Das Unit oben habe ich noch nicht ausprobiert |
Re: Delphi 2005 -> MS Access
Schau mal die mal diese
![]() Grüße Mikhal |
Re: Delphi 2005 -> MS Access
Mahlzeit und danke für den Link mit den Tutorials - hab jetzt immerhin schonmal nen Connect zu der DB hinbekommen... mal schauen wies weitergeht! :-)
|
Re: Delphi 2005 -> MS Access
Mahlzeit. Jetzt muß ich doch nochmal was fragen.
Ich hab jetzt nach dem Tutorial die Datenbank soweit eingebunden, den Connectionstring in der DB gespeichert etc. Dann hab ich noch im on-show event der form der ADOConnection den Connectstring aus der Registry gegeben. Hab auch ein ADOTable Object angelegt, dem ich eine Tabelle der Datenbank zugewiesen habe. Anschließend habe ich im before-open event der Tabelle die Connection ADOConnection1 (meine connection oben) zugewiesen, damit nicht jedes mal nach user und passwort etc. gefragt wird. Klappt soweit auch alles ganz gut, AUUUSSER (jaja, das liebe "außer"...): - Sobald ich die Felder der tabelle per Drag-und-Drop auf die Form ziehe und dann die Anwendung starte, werde ich immer nach user und passwort der DB gefragt - Außerdem scheint die Anwendung irgendwo noch die DB geöffnet zu behalten, obwohl ich im on-close(?) event die DB schließe - das äußert sich z.B. darin, daß ich die DB nicht umbenennen kann, solange das Projekt (nicht die Anwendung!) im Delphi geöffnet ist - wie schaffe ich es, daß ich Daten aus der DB lesen UND auf der Form darstellen kann, ohne daß ich jedes Mal die connection bestätigen muß??? Mit bitte um baldige Antwort und mit freundlichen Grüßen tyron78 |
Re: Delphi 2005 -> MS Access
Zu 1: Weil deine Tabelle keine Verbindung zur AdoConnection hat, fragt sie nach dem Kopieren nach der Connection
Zu 2: Verwende besser das Event OnCloseQuery des Hauptfensters, das wird IMMER abgearbeitet! Zu 3: Im ObjectInspector gibt es für die ADOConnection eine Eigenschaft LoginPrompt. Die steht standardmäßig auf True, setze diese mal auf False und der Spuk endet. Zusätzlich solltest du beim Erzeugen des Connsctionstring darauf achten, daß das Häkchen "Speichern des Kennworts zulassen" gesetzt ist. Grüße Mikhal |
Re: Delphi 2005 -> MS Access
Hallo, Mikhal.
Danke für die Antwort. Hab trotzdem noch ne Frage: Hab doch der Tabelle die ADOConnection1 zugewiesen (siehe oben - before open event)... reicht das nicht? Ansonsten werd ich mal Deine Tips zu Hause ausprobieren - hogffentlich klappt das dann... :roll: |
Re: Delphi 2005 -> MS Access
Du arbeitest mit einer ADOTable, die muss wissen, auf welcher Datenbank sie die Tabelle abgreifen soll. Damit das funktionieren kann, will die Komponente sofort auf die entsprechende Datenbank zugreifen.
Grüße Mikhal |
Re: Delphi 2005 -> MS Access
nAbend.
Danke nochmal für die Tips! Hat mir sehr geholfen. Hier eine kurze Zusammenfassung des aktuellen Standes: - Connection zur DB funzt - Connectionstring wird in Registry geschrieben und aus dieser gelesen - Login-Dialog wird übersprungen - Tabelle ist Connectionstring zugewiesen und wird dynamisch angepasst (Registry) - DB-Navigator greift auf die Tabelle zu und wird aktiviert, sobald die Verbindung steht Jetz ma schaun, wie's weitergeht... jetzt ma stück für Stück weitere Tabellen einbauen und joinen... mfg tyron |
Re: Delphi 2005 -> MS Access
Also, jetzt muß ich doch nochmal ganz dumm Fragen:
WOZU brauch man die ADOTables??? Ich habe - wie ja bereits angekündigt - mein Proggi weiterentwickelt. Hab ne ADOConnection, die funzt, hab ADOTables mit den Feldern der Tabellen aus der DB, hab eine ADOQuery (für die Abfragen) und ein ADOCommand (für update, insert, delete)... Die Sache ist nur die: Meine Queries greifen direkt auf die DB Tabellen zu - ich schreibe also Q1 := "select * from Table1" und nicht "select * from ADOTable1"... ist das falsch??? Wo liegt der nutzen in den ADOTables??? mfg tyron |
Re: Delphi 2005 -> MS Access
Der Aufbau der ADO-Komponenten (StoredProcedures, Query, Table) ist für die BDE-Umsteiger gedacht, die das so noch kennen. Deine Frage ist berechtigt und lässt sich so beantworten: Eigentlich gar nicht.
|
Re: Delphi 2005 -> MS Access
Danke für die schnelle Antwort. Dann kann ich nachher ja mal das bekloppte Icon Wirrwarr in meinem DataModule aufräumen...
mfg tyron |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz