Datenbanken



  • Hallo Klaus,

    keine Fehlermeldung. Der eingefügte Datensatz wird immer am Ende der Datenbank angehängt und nicht eingefügt. Problem tritt aber nur bei dBASE Dateien auf.
    Hast du eine Lösung?

    Gruß Ingolf



  • Naja, es ist ja generell so, das die Reihenfolge der Datensätze in einer Tabelle keine Rolle spielt. Man hat normalerweise auch keinen Einfluss auf die Reihenfolge der Daten. Die Datenbank legt den Datensatz dort an, wo halt gerade Platz ist.

    DBase ist eines der simpelsten DB-Formate wo gibt. Es gibt hier nur zwei Möglichkeiten einen Datensatz einzufügen. Entweder man sucht sich einen Datensatz mit Löschkennzeichen und ersetzt ihn durch die neuen Daten, oder man hängt ihn halt an's Ende der Datei. Das Raussuchen von Datensätze mit Löschkennzeichen ist natürlich teurer, weil man solange durch die Tabelle laufen muss, bis man einen findet.

    DBase kennt übrigens Indizies. Ich kenne mich mit Borland aber nicht aus. Keine Ahnung, wie man da einen Index anlegt... Man kann bei Dbase auch einen Index erstellen, der nur Datensätze mit Löschkennzeichen aufnimmt. Damit wäre dann die Methode zunächst die gelöschten Datensätze wiederzuverwenden performant machbar.



  • Hallo Frenki,

    hast nicht auf meine Frage geachtet. Kann doch mit insert in jede datei kommen. Nur nicht in die dBase-Datei, warum? Das war die Frage! Die Indizierung der Dateien ist für mich klar und ohne Geheimnisse, habe mich vor Jahren damit eingehend beschäfftigt. Dateien müssen aber "nicht indiziert" bleiben, um sie manuell sortieren zu können.

    Gruß Ingolf



  • hallo ingolf

    bei delphi 1.0 und der 16bit BDE habe ich das gleiche Problem.
    es gab in einer alten 'toolbox' aus den 90ern aber eine dbase-engine
    mit pascalsource die das einfügen von datensätzen an beliebiger
    position erlaubte.
    ich bin mir jetzt nicht im klaren ob alle c++builder auch eine BDE
    benötigen um auf dbase zugreifen zu können. es scheint so zu sein
    das borland diese funktion entweder nicht dokumentiert oder sogar
    nicht implementiert hat, wobei ich mehr zur schwachen dokumentation
    tendiere.

    mfg f.-th.



  • Beschreibe bitte nochmals dein Problem. Ich habe es nicht verstanden.
    Du willst eine Datensatz an einer beliebigen Stelle in der Datenbank einfügen?

    Ein neuer Datensatz wird immer, wie frenki schon geschrieben hat, an das Ende der Datei gespeichert.
    Das liegt daran das Datensätze nicht gelöscht werden wenn man ein Delete macht.
    Diese werden nur als gelöscht makiert da man nicht einfach aus Datei einen Bereich löschen kann ohne die Datei neu zu schreiben.



  • Ingolf! Sorry, aber du hast den Sinn einer DB ganz einfach nicht verstanden!

    KEINE Datenbank bietet es dir an, das du die Daten da ablegst, wo DU es willst. Die DB ist nur ein Datenpool um schnell und sicher Daten abzulegen.

    Wenn du z.B. die Datensätze in einer ganz bestimmten Reihenfolge lesen bzw. anzeigen willst, mußt du z.B. eine Sortierfunktion beim LESEN der Daten benutzen. Das physikalische schreiben macht die DB immer selber. Letztendlich kann und SOLL es dir egal sein, wie die Daten auf der Platte liegen. Sonst braucht man kein fertiges Datenbank-Produkt zu benutzen.

    Das ist ja so, als wenn du ein Auto kaufst, dich aber beim Hersteller beschwerst, wieso er etwas technisch so oder so gelöst hat, obwohl es dir egal sein kann. Denn du willst letztendlich von A nach B fahren. Du kannst aber selbst entscheiden welchen Weg du nimmst, um von A nach B zu kommen. Wie das Auto fährt kann und soll dir egal sein.



  • hallo

    also noch mal Ashton Tate (ich hoffe so war's richtig) Dbase erlaubte nur
    das anhängen von neuen datensätzen. Fürs sortieren waren die entsprechenden
    aufrufe zuständig.
    aber es gab mehrere clone, die das DBF-format nutzten und die das einfügen
    von datensätzen an beliebigen positionen zuliessen. dies ist unter umständen
    z.b. bei defekten dbase-tabellen interessant. ( man sollte seine alten daten-
    sicherungen von diskette wohl nun doch auf CD oder DVD brennen )http://www.c-plusplus.net/forum/images/smiles/wink.gif
    in c (c++) lässt sich diese funktion sicher einfach nachbauen. grob skizziert :
    tabelle bis einfügeposition lesen, datensatz einfügen und rest der tabelle
    anhängen.

    mfg f.-th.



  • nachtrag

    ich hab's vergessen : datensatzzähler erhöhen.

    mfg f.-th.



  • Mir ist kein RDBMS bekannt welches dies so macht.
    Grund: Es müsste jedesmal der Index neu aufgebaut werden.
    Es muss jedesmal die Datei neu geschrieben werden da man nicht so einfach in de3r Mitte der Datei was einfügen kann. Was wenn die Daten größer sind als der Platz?



  • Hallo,

    ich bedanke mich erst einmal für die rege Anteilnahme an meinem Problem.
    @ Artchi, ich denke den Sinn einer DB und deren Aufbau schon ein wenig zu kennen. (hätte lieber doch nicht "Anfänger" schreiben sollen!)
    Ich weiß auch wie man eine DB indiziert. Die Problematik ist mir geläufig. Betone aber noch einmal, meine DB ist nicht indiziert.
    Damit mir auch alle glauben, dass es funktionieren soll gebe ich zum besseren Verständnis einen kleinen Auszug aus der "Hilfe" mit.
    void __fastcall Append(void);
    1 Ein neuer leerer Datensatz wird am Ende der Datenmenge hinzugefügt.
    • Bei indizierten Paradox- und dBASE-Tabellen wird der Datensatz an der seinem Index entsprechenden Position in die Datenmenge eingefügt.
    • Bei nicht indizierten Paradox- und dBASE-Tabellen wird der Datensatz am Ende der Datenmenge angefügt.

    void __fastcall Insert(void);
    1 Ein neuer leerer Datensatz wird in der Datenmenge geöffnet.
    • Bei indizierten Paradox- und dBASE-Tabellen wird der Datensatz an der seinem Index entsprechenden Position in die Datenmenge eingefügt.
    • Bei nicht indizierten Paradox- und dBASE-Tabellen wird der Datensatz an der aktuellen Cursorposition eingefügt.

    Die Aussage des letzten Satzes will ich realisiert haben, nicht mehr und nicht weniger. Noch einmal zur Erklärung: Bei nicht indizierten Paradox-Tabellen wird der Datensatz an der aktuellen Cursorposition eingefügt.
    Bei dBase-Tabellen jedoch nicht. Weshalb?

    MfG Ingolf


Anmelden zum Antworten