| Autor |
Beitrag |
Ydobon
      
Beiträge: 42
|
Verfasst: Fr 11.04.08 16:13
Das Erstellen einer DB geht auch per ADOX. Wenn man die gesamte Typenbibliothek nicht zu importieren braucht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| uses ...ComObj; var cat: OLEVariant; begin cat:=CreateOleObject('ADOX.Catalog'); cat.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\test.mdb'); cat:=unassigned; end; |
Die DB kann man dann mit einer ADOConnection verbinden und durch SQL beliebig füllen.
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Fr 11.04.08 17:09
Sehr gut, das hatte ich nach langem suchen auch mal rausgefunden.
In Delphi7 hatte ich die ADOX TypeLibrary eingebunden und dann den ADOXCatalog Befehl benutzt.
Das einbinden der TypeLib ist aber nicht ganz einfach und ab den höheren Versionen ging das dann gar nicht mehr.
Braucht man für diese Variante keine Typelib mehr ?
Ansonsten wollte ich nicht gleich mit Kanonen auf Spatzen schießen, aber wenn Du schon mal damit anfängst, dann biete ich hier mal eine vollständige Variante des ganzen.
Da habe ich dann auch irgendwann mal im Forum gefunden. wozu so ein Forum nicht alles gut ist  .
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| uses Variants, ComObj; const dbVersion10 = 1; dbVersion11 = 8; dbVersion20 = 16; dbVersion30 = 32; dbVersion40 = 64;
function CreateDB(const FileName: String; const Version: Integer; DelIfExists: Boolean = False): String; var DBEngine, Workspace, Database : OleVariant; s : String; const dbLangGeneral = ';LANGID=0x0409;'; begin Result := ''; if FileExists(FileName) And DelIfExists then DeleteFile(FileName); s := dbLangGeneral + 'CP=' + IntToStr(GetACP()) + ';COUNTRY=0'; DBEngine:= CreateOleObject('DAO.DBEngine.36'); try try Workspace := DBEngine.Workspaces[0]; Database := Workspace.CreateDatabase(FileName, s, Version); Database.Close; Workspace.Close; except On E: Exception do Result := E.Message; end; finally Database := NULL; Workspace := NULL; DBEngine := NULL; end; end;
procedure TForm1.BtnDBNeu.Click(Sender: TObject); begin CreateDB('test.mdb', dbVersion20); end; |
Damit wäre erst mal die Datenbank angelegt.
Als nächste muss die Tabelle in der DB angelegt werden.
Das erfahren wir dann in der nächten Sendung 
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Fr 11.04.08 17:52
Hier dann wie man die Tabellen anlegt.
Habe das nur so im Editor zusammengestellt, gebe keine Garantie für die Funktion.
Soll ja auch nur zeigen wie man es macht.
Con1 ist die ADOConnection und QKonten und QWaehrung sind Querys die mit der ADOConnection verbunden sind.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure CreateTable; const cCreateKonten = 'CREATE TABLE Konten(' + 'KontoNr char(5) PRIMARY KEY,' + 'Beschriftung char(50),' + 'KontenTyp char(1),' + 'SH char(1),' + 'Land char(30),' + 'USTID char(20))';
cCreateWaehrung = 'CREATE TABLE Waehrung(' + 'Nr AutoInc PRIMARY KEY,' + 'Beschreibung char(30),' + 'Eurokurs double,' + 'EuroSt double,' + 'EuLand char(2),' + 'BasisWBetrag double,' + 'BasisWKennung integer)';
begin Con1.Active:=True; QKonten.SQL.Text:=cCreateKonten; QKonten.ExecSQL; QWaehrung.SQL.Text:=cCreateWaehrung; QWaehrung.ExecSQL; QKonten.SQL.Text := 'Select * From Konten'; QKonten.open; QWaehrung.SQL.Text := 'Select * From Waehrung'; QWaehrung.open; End; |
|
|
Black_Fox 
      
Beiträge: 66
|
Verfasst: Fr 11.04.08 18:09
hi jop hab access 2007 und auch schonmal nen bissl damit in der schule gearbeitet, könnte auch mein kleines addressbuch ändern bloß nun hab ich die frage ob ich in der access datenbank auch bilder speichern kann?
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Fr 11.04.08 19:34
Wenn Du Access 2007 hast, dann mustt Du nach dem anlegen der DB die DB als Access2000 Format speichern, das 2007er Format geht nicht mit den ADO Komponenten.
Man kann auch Bilder in der Datenbank speichern, das ist aber kompliziert, einfacher ist es die Bilder in einem separaten Pfad abzulegen und in der Datenbank nur den Pfad und Dateinamen abzulegen.
Glaub aber nicht, dass das Bild von alleine angezeigt wird wie in den DBEdit Komponenten, ein bisschen muss man dafür schon tun.
Setze eine Image Komponente aufs Formular und lade bei jedem Datensatzwechsel das Bild in die Image rein.
|
|
Black_Fox 
      
Beiträge: 66
|
Verfasst: Fr 11.04.08 22:25
klingt ja kompliziert^^ naja werd mich das we mal damit beschäftigen erstmal den aufbau mit den ado komponenten etc
|
|
Bernhard Geyer
      
Beiträge: 721
Erhaltene Danke: 3
|
Verfasst: Sa 12.04.08 00:54
Ydobon hat folgendes geschrieben: | | Access ist doch eigentlich nicht unbedingt notwendig, die Jet Engine sollte doch ab 2000 bei Windows auch so dabei sein? |
Jein. Bei den Embedded-Versionen von XP (und vermutlich auch Vista) kann man konfigurieren ob man auch die Jet-Engine haben will. Ist diese nicht konfiguriert kann sie nicht einzeln (per MDAC-Installer) nachinstalliert werden. Man braucht dann eine richtige Access-Installation.
|
|
Black_Fox 
      
Beiträge: 66
|
Verfasst: Sa 12.04.08 13:50
ok SmileySN kannste mir mal alle komponenten sagen die ich jetzt für die umsetzung mit access brauche?
hab zurzeit diese scon aufn formular:
adotable, adoconnection, adoquery, datasource
für das eintragen von daten:
dbnavigator, mehrere db edit felder, ein dbimage
für das anzeigen der daten:
dbgrid
z den ganzen komponenten kommen noch zusätzliche dige hinzu wie buttons und menü etc. aber denke die spielen erstmal keine rolle
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Sa 12.04.08 15:01
OK, dann hast Du ja schon alles.
Die Table brauchen wir erst mal nicht.
Jetzt erst mal am besten mit dem assistenten im Objektinspector in der ADOConnection den ConnectionString aufbauen.
Doppelklick auf Connectionstring dann Button Aufbauen drücken dann "Microsoft Jet 4.0 OLE DB Provider" auswählen.
Weiter Button drücken.
Datenbank (mdb)auswählen mit ...
Verbindung Testen. Es sollte OK erscheinen.
Die Query auswählen und im Objectinspector unter Connection die ADOConnection auswählen.
SQL im Objectinspector auswählen mit doppelklick und folgendes eingeben: Select * from Tabellenname
(Hier den Tabellennamen der Tabelle in der Datenbank eingeben)
Datasourcekomponente auswählen.
Bei Dataset die Query auswählen.
Im DBGrid,DBEdit,Navigator jeweils die Datasource auswählen.
Beim DBEdit muss man noch das Datenfeld angeben das dort angezeigt werden soll.
Dann zum testen mal die connection auf active setzen, dann die query und dann die Datasource.
Jetzt sollten schon mal Daten im Grid und den Editfeldern erscheinen.
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Sa 12.04.08 15:05
Wenn man seine Daten sortiert haben möchte, dann im Programm folgendes eingeben.
Delphi-Quelltext 1: 2:
| Query.SQL.Text:='Select * from Tabellenname order by feldname'; Query.open; |
danach sind die Daten nach Feldname sortiert.
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Sa 12.04.08 15:19
Diesen Thread auch mal durchlesen für den nächsten Schritt: www.delphi-forum.de/viewtopic.php?t=82483
|
|
Black_Fox 
      
Beiträge: 66
|
Verfasst: So 13.04.08 13:54
k hab das jetzt soweit also die daten von einer tabelle in der datnebank werden in der grid angezeigt
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 13.04.08 14:30
Gut, und mit dem Navigator kannst Du Dich in der Tabelle auch bewegen, hinzufügen und löschen.
Was soll jetzt noch funktionieren ?
|
|
Black_Fox 
      
Beiträge: 66
|
Verfasst: So 13.04.08 16:22
jup geht, na bilder muss ich da jetzt noch irgendwie mit rein achen oder so wie du das gesagt hattest mit dem pfad der bilder aber hab kein plan wie ich das machen soll
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: So 13.04.08 20:43
Das mit dem Bild ist doch gar nicht schwer, man muss sich nur von dem Gedanken lösen, das es von alleine geht.
Mit irgendwas musst Du doch Deinen Datensatzzeiger bewegen um auf den nächsten Datensatz zu kommen.
Wenn Du noch mit dem Navigator arbeitest, dann solltest Du dor mal in die ereignisse gehen und dir die mal ansehen, da gibt es betimmt eines, das ausgelöst wird, wenn Du den Datensatz bewegst.
Da machst Du einen doppelklick drauf und kommst in eine neue Prozedur, darin kannst Du dann den Namen des Bildes aus der Datenbank lesen (der solte beim neuanlegen des Datensatzes mit OpenFileDialog abgelegt worden sein) und Das auf dem Formular sitzende Image damit füllen.
Image.Picture.Loadfromfile(Dateiname aus Datenbankfeld);
Jedesmal wenn Du eine Datensatzbewegung machst wird dieser Befehl ausgeführt und das Bild wird geladen und angezeigt.
|
|
Black_Fox 
      
Beiträge: 66
|
Verfasst: Mo 14.04.08 10:45
ok ich werds mal mit dem ereignis beforeaction probieren
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 14.04.08 12:15
Ich habe mir den DBNavigator mal angesehen, der ist zum Programmieren kaum zu gebrauchen, soweit ich das sehe.
Die einzelnen Funktionen haben kein eigenes Ereignis.
Ich benutze immer nur Buttons für die Funktionen, das ist ganz einfach.
Button auf Formular Caption umbenennen in "Weiter" und einen doppelklick drauf, dann "Query.next;" reinschreiben.
Query sollte der Name Deiner Querys sein.
Dasselbe mit Button "Zurück" "Query.Prior;"
Dann gibt es noch .Last und .First.
Für "Neu" kann man query.append benutzen.
Für "Speichern" Query.Post.
Wenn Du das hast, kannst Du in die Prozedur ButtonWeiter.Click dann auch das laden des Bildes mit einbauen, ebenso in die Zurück Prozedur.
|
|
Black_Fox 
      
Beiträge: 66
|
Verfasst: Mo 14.04.08 14:04
ok thx dann werd ich die navi weglassen und eigene buttons verwenden
Hab noch ne Frage:
Kann ich den Pfad so aus der Db lesen? und mit writeln speichern?
Delphi-Quelltext 1:
| readln(ADOQuery1.FieldByName('Bild').asstring); |
Delphi-Quelltext 1:
| writeln(ADOQuery1.FieldByName('Bild').asstring); |
Achja und muss die Spalte 'Bild' in meiner Db nun ein Blob Feld sein oder ein Textfeld?
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 14.04.08 19:22
Nein, nicht ganz richtig!!
ReadLn und WriteLn sind Befehle für TextFiles und werden folgendermaßen benutzt:
wenn F vom Typ Textfile ist:
Delphi-Quelltext 1: 2:
| ReadLn(F,ADOQuery1.FieldByName('Bild').asstring)); WriteLn(F,ADOQuery1.FieldByName('Bild').asstring)); |
Wobei man beim ReadLn dann erst mal ein Query.edit machen muss, da sich die Datenbank sonst nicht beschreiben lässt.
Nach dem ReadLn muss dann auch noch ein Query.post kommen, damit der Datensatz auch weggeschrieben wird.
Sonst ist er nur im Cache. (Aber erst, wenn alle Felder gelen wurden einen post machen, nicht bei jedem Feld)
Mi WriteLn kannst Du aber keine CSV Datei erstellen wie Du es vorhast.
Dazu musst Du den Write Befehl nehmen und nach jedem Feld auch noch das Trennzeichen schreiben.
Erst wenn das letzte Feld geschrieben wird, dann macht man ein WriteLn.
Bein lesen ist das wieder anders, da liest Du einmal mit Readln in eine Variable und zerlegst diese dann in ihre Felder.
Somit wird das mit dem ReadLn und WriteLn mit Datenfeld direkt sowieso nichts.
Wenn ich es gleich finde, schick ich mal ne Lösung fürs schreiben in csv gleich hier rein.
Moderiert von Klabautermann: Delphi-Tags hinzugefügt.
|
|
SmileySN
      
Beiträge: 297
WinXP, Win7
Delphi 2010 Professional
|
Verfasst: Mo 14.04.08 19:34
Hier ein Beispiel, wie man aus einer CSV Datei liest:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; ListBox1: TListBox; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1; Function GetFeld(a : String; Var z : Integer) : String;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); Var ProgPath ,a , Konto, SKD, BEschreibung, Land, USTID: String; Datei : Textfile; Kopf : Boolean; z : Integer; begin Kopf := True; ProgPath:=ExtractFilePath(paramstr(0)); opendialog1.InitialDir := ProgPath; Opendialog1.Execute; AssignFile(Datei, Opendialog1.FileName); try reset(Datei); except exit; end; If Kopf then readln(Datei,a); While not EOF(Datei) do Begin z := 1; readln(Datei,a); Konto := GetFeld(a,z); SKD := GetFeld(a,z); Beschreibung := GetFeld(a,z); Land := GetFeld(a,z); USTID := GetFeld(a,z); Listbox1.items.add(Konto+ ' '+ SKD + ' '+ Beschreibung + ' '+ Land + ' '+ USTID); End; end;
Function GetFeld(a : String; Var z : Integer) : String; Begin Result := ''; While z <> Length(a) do If a[z] <> ';' then Begin Result := Result + a[z]; inc(z); End Else Begin inc(z); Exit; End;
End;
end. |
|
|