Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Textdatei als Datenbank nutzen (https://www.delphipraxis.net/38280-textdatei-als-datenbank-nutzen.html)

Opa Knack 17. Jan 2005 01:40


Textdatei als Datenbank nutzen
 
Hallo,

ich bin gerade dabei, ein kleines Abfragetool zu erstellen, in dem Auswahlkriterien in einer Datenbank abgelegt werden müssen. Das Endprodukt soll weitergegeben werden, und ich möchte auf die BDE verzichten. Da das Produkt kostenlos sein wird, möchte ich natürlich auf die Lizenzierung einer DB verzichten.

Nun stellt sich natürlich die Frage, auf welcher Basis ich die Datenbank anlegen kann. Bislang habe ich nur XML ausfindig machen können, aber ich habe noch keine "seniorentaugliche" Möglichkeit gefunden, mein Vorhaben mit XML umzusetzen.

Kennt jemand eine wirklich deppensichere Anleitung dazu, die möglichst schnell umsetzbar wäre (oder eine Komponente, die ich einsetzen könnte)? Oder: Kann mir jemand einen Tipp geben, wie ich die Datenbank sonst noch anlegen könnte? Ich habe bisher viel in PHP programmiert, und da habe ich mal ein Script gesehen, welches es ermöglichte, eine CSV-Datei mit SQL-Anweisungen anzusprechen. Gibt es sowas auch für Delphi (ich habe bislang nichts finden können)?

Danke
Opa

MrSpock 17. Jan 2005 07:00

Re: Textdatei als Datenbank nutzen
 
Hallo Opa Knack,

trage doch einmal deine Delphi Version in dein Profil ein. Ich nehme an, dass du Datenbank Support in Delphi hast (Professional Version oder höher). In diesem Fall könnte myBase etwas für dich sein. Basiert wahlweise auf XML oder einem internen Binärformat. Ein MyBase Tutorial gibt es bei Delphi-Source.de.

MaBuSE 17. Jan 2005 07:07

Re: Textdatei als Datenbank nutzen
 
Zitat:

Zitat von Opa Knack
Das Endprodukt soll weitergegeben werden, und ich möchte auf die BDE verzichten. Da das Produkt kostenlos sein wird, möchte ich natürlich auf die Lizenzierung einer DB verzichten.

Es gibt viele Alternativen zu der BDE.
Die BDE darf übrigens kostenlos mit Deiner Anwendung weitergegeben werden (nur wegen der Lizensieung).

Hier ist eine Seite mit Infos über Alternativen zur BDE (einige davon sind auch kostenlos).

http://www.kylecordes.com/bag/

Klicke auf "the List" um eine Liste aller auf dieser Seite besprochenen Alternativen zu bekommen.
Die Liste ist leider nicht sehr aktuell und selbstverständlich NICHT vollständig.

Von Textdateien würde ich Dir abraten. (Ich habe damit schlechte Erfahrungen gemacht.)

Ich würde Dir zu kbMemTable raten.
Das ist ein TDataset Abkömmling, der die Daten nur im Speicher vorhällt.
Es gibt aber die Möglichkeit die Daten abzuspeichern. (mehrere Formate und eigene Schnittstelle den Stream z.B. zu komprimieren)

[equote=" http://www.components4developers.com/ "]kbmMemTable
Simply the best Open Source, InfoWare in memory table for Delphi and BCB. The software is free and includes full source.[/equote]

Cyberbob_at_tot 17. Jan 2005 07:36

Re: Textdatei als Datenbank nutzen
 
Also ich habe einfach mit einer Textdatei gearbeitet,
Schau dir doch mal die DVD Datenbank auf meiner Homepage an, da habe ich als DB Datei eine TXT gewählt, war nur ein Text also nicht ernstnehmen das Programm.

ChristianDannenberg.info

MaBuSE 17. Jan 2005 07:52

Re: Textdatei als Datenbank nutzen
 
Zitat:

Zitat von Cyberbob_at_tot
Also ich habe einfach mit einer Textdatei gearbeitet,
Schau dir doch mal die DVD Datenbank auf meiner Homepage an, da habe ich als DB Datei eine TXT gewählt, war nur ein Text also nicht ernstnehmen das Programm.

Wenn du bei einer TTable Die Eigenschaft TableType auf ttASCII änderst, kannst Du zwar bei Tablename eine C:\TEMP\Datei.TXT verwenden, aber es wird immer noch die BDE benötigt.

Das Format der Textdatei kann übrigens über eine Schema-Datei (*.sch) Datei vorgegeben werden.

Es sind unter anderem Fixed Format, Variable Format, verschiedene Feldtypen, ... möglich
Aber es kann kein Index verwendet werden und es ist nur ein Anhängen von Daten möglich.
(Neue Daten werden also nur hinten an geschrieben)

In Delphi 1 und Delphi 2 war noch eine sehr ausführliche Beschreibung dieser Funktionalität in Form einer Text Datei beigelegt. In den neueren Versionen funktioniert das zwar immer noch, aber ich habe die Beschreibung noch nicht gefunden.

Opa Knack 18. Jan 2005 08:00

Re: Textdatei als Datenbank nutzen
 
Hallo,

Danke schon mal für die Antworten.

Ich habe mir jetzt erst einmal die typisierten Dateien angeschaut, die mich irgendwie an meine C64-Zeiten (sequentielle Dateien) erinnern. Damit kann man schon etwas umsetzen. Nur frage ich mich, ob das wirklich effektiv genug ist und wie "sicher" der Datenbestand ist. Das Problem ist, dass zwar nicht viele Daten abgelegt werden müssen, dass diese aber mehr oder weniger geschäftskritisch sind und somit ein Grundmaß an Sicherheit gegeben sein sollte (in Bezug auf fehlerhaften Umgang mit der DB-Datei, ...).

Somit komme ich auf XML und zu meiner nächsten Frage: Gibt es eine relativ einfache Möglichkeit oder ein verständliches Tutorial, mit dem selbst prähistorische Tastenquäler wie ich klar kommen könnten? Oder eine vorgefertigte Komponente, die auf diesen Zweck abzielt?

Und gehe ich recht in der Annahme, dass die XML-Variante durch ihren systematischen Aufbau sicherer und einfacher zu handeln ist als typisierte Dateien?

Danke
Opa

MaBuSE 18. Jan 2005 08:16

Re: Textdatei als Datenbank nutzen
 
Zitat:

Zitat von Opa Knack
Somit komme ich auf XML und zu meiner nächsten Frage: Gibt es eine relativ einfache Möglichkeit oder ein verständliches Tutorial, mit dem selbst prähistorische Tastenquäler wie ich klar kommen könnten? Oder eine vorgefertigte Komponente, die auf diesen Zweck abzielt?

Ja,
Mr. Spock gab Dir ja schon den Link auf das Tutorial.
Zitat:

Zitat von MrSpock
Ein MyBase Tutorial gibt es bei Delphi-Source.de.

XML speichern mit nur einem Befehl:
Delphi-Quellcode:
ClientDataSet1.SaveToFile('c:\temp\opa.xml', dfXML);

Robert_G 19. Jan 2005 08:55

Re: Textdatei als Datenbank nutzen
 
Damit man sich das Mapping zwischen Objeken und der Datei sparen kann werfe ich mal den Thread in die Diskussion. ;)

MrSpock 19. Jan 2005 09:31

Re: Textdatei als Datenbank nutzen
 
Hallo Opa Knack,

typisierte Dateien sind auch eine gute Lösung. Ich habe über Jahre hinweg mit typisierten Dateien gearbeitet und nie Probleme mit Datenverlusten gehabt. Natürlich ist eine tägliche Datensicherung Pflicht bei geschäftskritischen Daten!

Robert_G 19. Jan 2005 10:30

Re: Textdatei als Datenbank nutzen
 
Zitat:

Zitat von MrSpock
Hallo Opa Knack,

typisierte Dateien sind auch eine gute Lösung. Ich habe über Jahre hinweg mit typisierten Dateien gearbeitet und nie Probleme mit Datenverlusten gehabt. Natürlich ist eine tägliche Datensicherung Pflicht bei geschäftskritischen Daten!

Aber dann landest du bei Records! Die müssen dann wieder zu Instanzen deiner Klassen übersetzt werden. (Oder willst du tatsächlich mit Records in deiner Anwendung arbeiten? )
Außerdem kannst du keine alten Daten laden, wenn du den Record zwischendurch erweitert hast.
File of [Datentyp] halte ich generell für die schlechteste Persistenzlösung. ;)

MrSpock 19. Jan 2005 11:16

Re: Textdatei als Datenbank nutzen
 
Hallo Robert,

es spricht absolut nicht dagegen mit Records zu arbeiten. Man kann ja eine Klasse schreiben, die einige nützliche Funktionen auf diesen Records kapselt. Wenn du mit Datenbanken arbeitest, bekommst du ja die Daten auch in einer Datenmenge, die keine Klasse ist, sondern du musst die Daten erst noch verarbeiten, bis du sie weiterverwenden kannst. Eine Erweiterung ist auch kein großes Problem. Ein Konvertieren der Daten sollte bei kleinen Änderungen in wenigen Minuten programmiert sein.

Natürlich halte ich Datenbanken für besser geeignet, aber typisierte Dateien sind aus meiner Sicht keine schlechte Lösung, wenn man keine DBs will.

Sleipnir181 14. Jul 2017 13:47

AW: Textdatei als Datenbank nutzen
 
Hallo,
ich hänge mich einfach mal an diesen alten Post ran, da es bei mir um was ähnliches geht.

Ich bin ein Delphi Anfänger.

Nun wollte ich ein Programm schreiben, in welchem eine Art Rezept erstellt wird.

Es gibt bestimmte Zutaten mit verschiedenen eigenschaften. zB.: Eier : 100% Protein, xx% Fett usw...
Diese Daten würde ich gerne in einer .txt Datei oder so ähnlich gespeichert haben. In dem Programm stehen die verschiedenen möglichen Zutaten und man muss dort die Menge eingeben.
Wenn man das für alle Zutaten gemacht hat klickt man auf einen button und bekommt eine Ausgabe mit dem gesamt Proteingehalt, gesamt Fettgehalt usw.

das ist der Grundgedanke.
Nunweiß ich jedoch nicht, wie ich diese txt Datei (oder ähnliches) in das programm einbinde etc.

Kann mir da evtl jemand behilflich sein?

Grüße
Ulf

Redeemer 14. Jul 2017 14:13

AW: Textdatei als Datenbank nutzen
 
Das Dateiformat wird in der Regel CSV sein. Entgegen des Namens benutzt man meistens Semikolons zur Trennung. Auch Excel tut das.

Hier ein paar sehr einfache Funktionen aus meinen Projekten, mit Sicherheit verbesserungsfähig aber sie sollten dir helfen.

Einen Typ für ein dynamisches zweidimensionales Array erstellen, macht Zuweisungen einfach:
Delphi-Quellcode:
type TString2D = array of array of string;
Database: TStrings2D;
Eine Funktion zum Auslesen der CSV-Daten einer TStringList (Fields = Anzahl der Spalten).
Delphi-Quellcode:
procedure InitDatabase();
function CSVToArray(Input: TStrings; Fields: Integer): TString2D;
var
  i, j, k, l: Integer;
  s: string;
begin
  i := Input.Count;
  SetLength(Result, i);
  j := 0;
  repeat
    s := Input.Strings[0];
    l := 0;
    SetLength(Result[j], Fields);
    for k := 1 to Length(s) do
    if s[k] = ';' then
    inc(l)
    else
    Result[j][l] := Result[j][l] + s[k];
    inc(j);
    Input.Delete(0);
    dec(i);
    if i = 1 then
    s := '';
  until i = 0;
end;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile('database.csv');
    Database := CSVToArray(sl, 42); // 42 ändern zur Anzahl der maximal genutzten Spalten
  finally
    sl.Free;
  end;
end;
Anschließend kann man auf die Strings zugreifen:
Delphi-Quellcode:
Database[1][0]
(erste Spalte des zweiten Datensatzes)
Wichtig ist, dass es zunächst mal alles Strings sind, man sie also ggf. in Zahlen umwandeln muss, um damit zu rechnen.

Die Funktion unterstützt keine Quantifiers, sprich du solltest keine Semikolons in deinen Einträgen verwenden.

mkinzler 14. Jul 2017 15:17

AW: Textdatei als Datenbank nutzen
 
Man könnte auch ein CSVDataSet verwenden oder noch besser ein (embedded) DBMS.

Rollo62 14. Jul 2017 19:50

AW: Textdatei als Datenbank nutzen
 
FdMemTable ?

p80286 14. Jul 2017 20:43

AW: Textdatei als Datenbank nutzen
 
Zitat:

Zitat von Sleipnir181 (Beitrag 1376726)
Nunweiß ich jedoch nicht, wie ich diese txt Datei (oder ähnliches) in das programm einbinde etc.

Wenn Du Dich etwas detailierter äussern würdest, wäre es etwas einfacher Dir einen Tip zu geben.
Soll direkt auf die Textdatei zugegriffen werden, wären Datensätze mit fixer Satzlänge meine erste Wahl. Willst Du eine interne Struktur (z.B. TList) mit Daten füllen, ist CSV keine schlechte Wahl.
Was das Einbinden angeht, kommt es auf die konkreten Anforderungen an.

Gruß
K-H

FAlter 15. Jul 2017 07:14

AW: Textdatei als Datenbank nutzen
 
Zitat:

Zitat von Redeemer (Beitrag 1376733)
Eine Funktion zum Auslesen der CSV-Daten einer TStringList (Fields = Anzahl der Spalten).

Eine zweite StringList nehmen und den Inhalt CommaText (für echtes CSV mit Komma) oder DelimitedText (Trennzeichen beliebig festlegbar) zuweisen. Dann enthält die zweite StringList die Werte der Zeile als einzelne Einträge.

Zitat:

Die Funktion unterstützt keine Quantifiers, sprich du solltest keine Semikolons in deinen Einträgen verwenden.
Das Problem wäre damit auch gelöst. Die RTL kann das alles schon.

Für komplexere Anwendungsfälle zum Speichern gerne ein DBMS. CSV wird aber auch extrem gerne als Datenaustauschformat verwendet, z.B. für Schnittstellen oder Migrationen.

haentschman 15. Jul 2017 08:30

AW: Textdatei als Datenbank nutzen
 
Moin...:P
Zitat:

17. Jan 2005, 02:40
In den 12 Jahren hat sich einiges getan. 8-)
Zitat:

Es gibt bestimmte Zutaten mit verschiedenen eigenschaften. zB.: Eier : 100% Protein, xx% Fett usw...
Das sind Daten für ein klassisches DBMS. Die Datenbanken sind dafür ausgelegt Daten "herauszusuchen". Mal angenommen, du willst eine Liste mit den Rezepten haben, sortiert nach der Fettmenge. Mir einer TXT/CSV/XML hast du mehr Aufwand als nötig.
Meine Daumenregel:
TXT/CSV/XML als Datenaustauschformat ist in Ordnung wenn die Daten nur readonly sind. Alles Andere gehört in ein DBMS. :thumb:

Wie es die Andreren schon bemerkten:
Zitat:

Für komplexere Anwendungsfälle zum Speichern gerne ein DBMS
:thumb:
Zitat:

Willst Du eine interne Struktur (z.B. TList) mit Daten füllen, ist CSV keine schlechte Wahl.
! nur readonly :thumb:

Empfehlung für ein DBMS:
Firebird:
https://de.wikipedia.org/wiki/Firebird_(Datenbank)
https://www.firebirdsql.org/en/server-packages/ für den Anfang die Version 2.5
Firebird Vorteile:
* minimaler Installationsaufwand (ca. 10 Minuten)
* Ein Datenbankfile.
* Das Datenbankfile kann man z.b. auf einen USB Stick kopieren und wieder zurück.
* Wechsel zwischen Multiuser und Einzelplatz ohne Aufwand möglich.
Datenzugriff
* Zeos: https://sourceforge.net/projects/zeoslib/
* Tutorial: https://www.delphi-treff.de/tutorial...-und-firebird/
Admin Tool
* IBExpert Personal: http://ibexpert.net/IBE/index.php?n=...ersonalEdition
Datenbank Tutorial
* ! es geht nur ums Prinzip. :wink: https://www.youtube.com/watch?v=eNWqPw_73vU ...und folgende.

Zitat:

Diese Daten würde ich gerne in einer .txt Datei oder so ähnlich gespeichert haben.
Ein Tretauto ist auch ein Auto. Aber würdest damit in den Urlaub fahren? :stupid: Mit einer Datenbank hast du etwas mehr Lernaufwand. Wenn du aber die Vorteile erkannt hast, willst du es nicht mehr missen. :zwinker:

Stichworte:
http://docwiki.embarcadero.com/Libra...ta.DB.TDataSet
http://docwiki.embarcadero.com/Libra...DB.TDataSource

..jetzt hast du mal Brot. :thumb:

p80286 15. Jul 2017 09:01

AW: Textdatei als Datenbank nutzen
 
@haentschman
Ich vermute, er scheut den "Aufwand" für eine DB, und leider hast Du die notwendigen Komponenten für den DB-Zugriff erst ab Prof. an Bord. Da schreckt man schon mal gerne zurück.

Gruß
K-H

P.S.
Gerade gesehen, er hat ja die prof Version, da sollte es ja gut gehen.

Redeemer 16. Jul 2017 16:44

AW: Textdatei als Datenbank nutzen
 
Danke FAlter für den Hinweis mit CommaText und DelimitedText.

MaBuSE 17. Jul 2017 10:07

AW: Textdatei als Datenbank nutzen
 
Zitat:

Zitat von Redeemer (Beitrag 1376800)
Danke FAlter für den Hinweis mit CommaText und DelimitedText.

Schau Dir mal folgendes an: http://www.delphipraxis.net/164041-c...ntdataset.html

Das ist ein einfacher Classhelper um CSV Dateien mit einem TClientDataset Lesen / Schreiben zu können.

Das habe ich dort auch mit 2 TStringList gemacht. ;-)

Delphi-Quellcode:
...
   // folgender Quelltext ist nur im Editor der DP geschrieben, nicht getestet ;)
   slFile := TStringList.Create;
   slRow := TStringList.Create;
   try
     slRow.Delimiter := ';';
     slRow.QuoteChar := '"';
     slRow.StrictDelimiter := True;
     slFile.LoadFromFile('C:\TEMP\TEST.CSV');

     for i := 0 to slFile.Count - 1 do
     begin
       slRow.DelimitedText := slFile[i];
       for j := 0 to slRow.Count - 1 do
       begin
         myArray[i,j] := slRow[j];
       end;
     end;
  finally
     slFile.Free;
     slRow.Free;
   end;
...
Das habe ich vor über 6 Jahren gemacht um leicht auf meine Logfiles zugreifen zu können.
Für die CodeLib hab ich dann noch das Schreiben implementiert.

Das Ganze dient aber auch als nettes Beispiel für einen ClassHelper :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz