Alle Einträge aus DBGrid/Datenbank löschen?



  • Hallo Gemeinschaft,

    ich habe hier einen Programmteil der nicht von mir ist, den ich jedoch verwenden muss. Und zwar werden Daten aus einer Datei in eine Datenbank gespeichert und diese Datenbank kann man sich dann mittels einem Formular (mit DBGrid und DBNavigator drauf) anschauen. Mit dem Navigator kann man nun einen Eintrag aus dem DBGrid entfernen (und damit auch aus der Datenbank). Ich habe überhaupt noch garnicht mit den DB-Komponenten des BCB3 gearbeitet.
    Nun habe ich zu Testzwecken ziemlich viele Daten in der Ursprungs-Datei und damit dann auch in der Datenbank. Ich möchte diese mit einem Klick wieder aus der Datenbank entfernen können und nicht jeden Eintrag einzeln mit dem DBNavigator aus der Datenbank entfernen müssen. Den Kollegen von dem der Teil ist hab ich schon gefragt, er hat gesagt er wisse nicht wie er das machen soll... Nun steh' ich aufm Schlauch und müsste 60000Einträge per Hand löschen (60000Klicks).
    Könnt ihr mir helfen? Was braucht Ihr noch für Info's?



  • Hallo

    Dazu brauchst du nur eine SQL-Anweisung

    DELETE FROM <tablename>
    

    Das kannst du einmalig manuell im passendem Datenbank-Frontend ausführen oder im deinem Programm über TQuery bzw. Äquivalente Komponenten.

    bis bald
    akari



  • oder

    TRUNCATE TABLE tabellenname
    


  • Ähmm, schon wieder Bahnhof...
    Keine Ahnung von SQL... und SQL-Anweisungen...
    Datenbank-Frontend... ist die DBGrid-Komponente?
    TQuery oder äquivalente Komponenten... TQuery, nie benutzt. Äquivalente Komponenten: Ich hab da noch ne Table- und ne Data-Source-Komponente im Angebot, die damit zu tun haben, aber keine Ahnung wer da für wen was bereitstellt oder wer wen wann steuert...!?!
    Ich bin damit hoffnungslos überfordert... Ich bin nur dafür verantwortlich, dass die Daten in die Ursprungs-Datei kommen und in einem bestimmten Format bereitgestellt werden - mit der Datenbanksache hab ich nix zu tun, hatte ich auch noch nie... bin ja auch Elektrotechniker und kein Informatiker 😞

    Wo muss ich jetzt

    DELETE FROM Table1
    

    hinschreiben und was passiert dadurch???



  • Machen wir es anders:

    Ich hatte mir ja schon einen Trick einfallen lassen, bin aber nicht zum Ergebnis gekommen: Ich kann ja einen DBNavigator-Klick simulieren, wodurch ein Eintrag gelöscht wird:

    void __fastcall TForm2::ButtonDeleteAllClick(TObject *Sender)
    {
    	DBNavigator1->BtnClick(nbDelete);
    }
    //---------------------------------------------------------------------------
    

    Was ich jetzt noch wissen müsste ist, wieviel Einträge im DBGrid sind, dann könnte ich den Knopfdruck in einer Schleife autmatisieren und mir wäre geholfen!
    Also: wie bekomme ich die Anzahl der Einträge (Zeilen) im DBGrid heraus? (daran bin ich letztens gescheitert)



  • In dem Startmenü Eintrag vom BCB3 müßte es die Einträge 'Datenbank-Explorer' und 'Datenbankoberfläche' geben.
    Mit denen kannst du dann auf die Datenbanken (auch ohne eigenes Programm) zugreifen.
    Du mußt dann nur deine Datenbank öffnen und kannst dann die SQL-Befehle eingeben:
    - zum Anzeigen: SELECT * FROM table
    - zum Löschen aller Daten: DELETE FROM table
    - zum Löschen v. bestimmten Daten: DELETE FROM table WHERE condition

    Welche Datenbank verwendet ihr denn?



  • Hallo

    Die Anzahl der Zeilen eines DBGrids entspricht der Anzahl der Datensätze im DataSet, also TTable::RecordCount.
    Es sollte aber eigentlich reichen immer den ersten Datensatz zu löschen, schließlich wird das Grid nach jedem Löschen aktualisiert.

    Dir ist aber schon klar das das eine sehr schlechte Variante ist? Arbeite dich lieber in die Grundlagen von SQL und den Datenbank-Komponenten ein.

    bis bald
    akari



  • Th69 schrieb:

    In dem Startmenü Eintrag vom BCB3 müßte es die Einträge 'Datenbank-Explorer' und 'Datenbankoberfläche' geben.

    Ja, das hab ich schonmal gesehen.

    Th69 schrieb:

    Mit denen kannst du dann auf die Datenbanken (auch ohne eigenes Programm) zugreifen.

    Naja, ich würds bequemerweise schon gerne im Programm machen...

    Th69 schrieb:

    Du mußt dann nur deine Datenbank öffnen und kannst dann die SQL-Befehle eingeben:
    - zum Anzeigen: SELECT * FROM table
    - zum Löschen aller Daten: DELETE FROM table
    - zum Löschen v. bestimmten Daten: DELETE FROM table WHERE condition

    Ich komme drauf zurück, wenn nötig, Danke!

    Th69 schrieb:

    Welche Datenbank verwendet ihr denn?

    Sag ich dir gerne! Wo steht das?

    akari schrieb:

    Die Anzahl der Zeilen eines DBGrids entspricht der Anzahl der Datensätze im DataSet, also TTable::RecordCount.

    Ähm... daran scheiterts schon. Wenn ich mit

    int ZeilenAnzahl= DataModule7->Table1->RecordCount;
    

    die Zeilenanzahl hole, steht da 59779 drin, das DBGrid wird aber momentan leer angezeigt!?!

    akari schrieb:

    Es sollte aber eigentlich reichen immer den ersten Datensatz zu löschen, schließlich wird das Grid nach jedem Löschen aktualisiert.

    Weißer Mann spricht in Rätseln zu Programmier-Noob-Indianer vom Stamme VerflixterCode... 🤡

    akari schrieb:

    Dir ist aber schon klar das das eine sehr schlechte Variante ist?

    Ja, ich will nur Datenbank und DBGrid mal schnell leeren können, damit ich meine eigenen Tests hier vernünfig über die Bühne bekomme...

    akari schrieb:

    Arbeite dich lieber in die Grundlagen von SQL und den Datenbank-Komponenten ein.

    Du bist gut... Ich hab noch nicht mal GUI-Programmierung und C++ richtig verstanden, da soll ich mich in Datenbanken einarbeiten. 👍 Das ist nicht mein Gebiet und wird es auch nicht werden.



  • Ich versuche nochmal den Ablauf zu beschreiben: Ich habe Daten in einer Datei vorliegen. Diese Datei öffne ich und packe die Daten Datensatzweise in eine Struktur. Die Struktur wird danach mit

    const TVarRec Values[]=
       {
       //...
       };
    
    const int nCount= sizeof(Values)/ sizeof(Values[0]);
    
    Table1->InsertRecord(Values, nCount-1);
    

    in Table1 eingetragen (Table1 ist die Schnittstelle zur Datenbank?). Das Ganze geschieht sooft, wie ich in einem Edit vorher angebe (damit nicht immer die gesamte Datei eingetragen wird). Zur Zeit funktioniert aber nichmal das. Ich bekomme bei InsertRecord immer einen Indexfehler(exception), wenn ich 2 Datensätze in Table1 eintragen lassen will...
    Woher jetzt das DBGrid seine Daten zum Anzeigen nimmt und warum in Table1 soviel Records sind, aber keine im DBGrid- keine Ahnung.



  • Ein TQuery auf die Form.

    Query1->SQL->Clear();
       Query1->SQL->Add("DELETE FROM Table1;");
       Query1->ExecSQL();
    


  • Gut, ich habe jetzt (da nix mehr ging und mir bei jeder Operation nur noch Indexfehler-exceptions um die Ohren geflogen sind) mal Th96's Weg verfolgt: In der Datenbankoberfläche die *.db geöffnet (Datei->Öffnen->Tabelle) und geleert (Tools->Tabellenoperationen->Leeren...). Jetzt kann ich wieder Werte aus der Datei eintragen lassen und "Alles löschen" funktioniert auch 🙂 :

    void __fastcall TForm2::ButtonDeleteAllClick(TObject *Sender)
    {
    	int ZeilenAnzahl= DataModuleXYZ->Table1->RecordCount;
    	for(; ZeilenAnzahl>0; ZeilenAnzahl--)
    	{
    		DBNavigator1->BtnClick(nbDelete);
    	}
    }
    //---------------------------------------------------------------------------
    

    Und die Lösung von db_indianer (anscheinend ein wissender Krieger vom Stamme DatenbankAhoi) einfach in die Button-Methode (plus TQuery auf die Form) bringt dasselbe Ergebnis? Wird das DBGrid so auch gleich mitgeleert?



  • Und die Lösung von db_indianer (anscheinend ein wissender Krieger vom Stamme DatenbankAhoi) einfach in die Button-Methode (plus TQuery auf die Form) bringt dasselbe Ergebnis? Wird das DBGrid so auch gleich mitgeleert?

    Ja und das sogar erheblich schneller.


Anmelden zum Antworten