# Datenbankinhalt löschen



## Rosikopter (6. April 2003)

Wie kann ich den Inhalt einer Datenbank (mit ca. 20 Datenbanktabellen) bei jedem beenden eines Programmes löschen, das ich jedesmal beim Programmstart mit einer leeren Datenbank beginnen kann.


----------



## Thomas Darimont (6. April 2003)

Servus!

Mit VBA in Access...

Dim rs as new adodb.recordset

with rs
  .ActiveConnection = CurrentProject.Connection
  .LockType = AdLockOptimistic
  .CursorType = adOpenDynamic
  .Open "DROP DATABASE " &DBNAME

  .update
end with

//geht auch mit...

DoCmd.RunSQL "DROP DATABASE " & DBNAME

damit löschst du die komplette Datenbank mit allen Tabellen un deren Inhalt... bei jedem Programmstart müsstest du diese aber auch wieder aufbauen... mit "CREATE DATABASE BLABLABKL" und dann musst du auch die Tabellen wieder neu anlegen... 

-----

Wenn du nur die Inhalte von allen Tabellen löschen willst, dann benutz als "AbfrageString" doch einfach "DELETE * FROM TABELLE1, DELETE * FROM TABELLE2 ...." usw.

Somit erhälst du tabellenstruktur bei und löschst nur die "Inhalte"...

Gruss Tom


----------



## Rosikopter (7. April 2003)

Funktioniert VBA auch in einem normalen VB Programm???


----------



## Thomas Darimont (7. April 2003)

Servus!

Fast... 

Versuchs mal so:

Dim conn as new AdoDB.Connection
//Bei ner Access DB
conn.Open "Provider=Microsoft.Jet.OLEDB.3.51;" && _
          "Data Source =" & App.Path & "\myDB.mdb","username","passwort"
Hierbei muss sich die Access mdb. Datei im selben Verzeichnis wie die vom VB Editor erzeugte exe Datei liegen


//Bei nem SQL Server 
conn.Open "Provider=SQLOLEDB;USER ID = username;" &_
          "Catalog=meineDB; Data Source=localhost;"

Set rs = New ADODB.Recordset

with rs
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic
    .Open "Select * from tblBLABLABLA", conn
end with

Müsste so gehen...

Denk aber dran, dass du noch nen Verweis zu der Ado Bibliothek setzten musst ...

Extras->Verweise->Ado ActiveX Data Objects 2.X Library
                ->Microsoft ADO Ext. 2.6 for DDL and Security

Gruss Tom


----------



## Dario Linsky (7. April 2003)

Ich bin nicht ganz sicher, aber DROP DATABASE funktioniert meines Wissens nach mit Access nicht. Kann aber auch sein, dass ich falsch liege.
Wenn Du nur die Inhalte der Tabellen löschen willst, müsstest Du aus der Systemtabelle (MSysObjects - gibt es in jeder Access-DB) die Namen der Tabellen nacheinander auslesen und dann den Inhalt der Tabelle jeweils löschen. Wenn Du die Tabellennamen erstmal hast, kannst Du auch mit DROP TABLE die jeweilige Tabelle ganz löschen.

PS: 





> Dim rs as new adodb.recordset


Sowas macht man nicht.


----------



## Thomas Darimont (7. April 2003)

jaja.... *g*

Dim rs as AdoDB.Recordset

*Set rs = new AdoDB.RecordSet* 


...

Lirion hat recht, DROP DATABASE geht ei Access nicht ... 
aber DROP TABLE meineTabelle geht schon... aber wie gesagt, bei deinem Problem würde ich dir die delete Anweisung empfehlen, sonst müsstest du bei jedem Start des Programms deine Tabellen neu Anlegen(TableDef)...

Gruss Tom


----------



## Thomas Darimont (7. April 2003)

Servus!

Hab da noch ne Lösung gefunden, die jedoch nur dann Funktioniert, wenn du deine Tabellen alle mit tbl starten lässt.. und du auf die ADO Extensions 2.6 (2.5) for DDL and Security einen Verweis gesetzt hast...

tblSchuhe, tblHaus, tblZugriff, tblMember...

Dim cat as ADOX.Catalog
dim rs as adodb.recordset
Dim conn as new AdoDB.Connection
//Bei ner Access DB
conn.Open "Provider=Microsoft.Jet.OLEDB.3.51;" && _
"Data Source =" & App.Path & "\myDB.mdb","username","passwort"
Hierbei muss sich die Access mdb. Datei im selben Verzeichnis wie die vom VB Editor erzeugte exe Datei liegen


//Bei nem SQL Server 
conn.Open "Provider=SQLOLEDB;USER ID = username;" &_
"Catalog=meineDB; Data Source=localhost;"

set cat = new ADOX.Catalog
set rs = new adodb.recordset
cat.activeConnection = con

with rs
   .activeConnection = con
   .Locktype = adLockOptimistic
   .CursorType = adOpen
end with

dim i as Integer 
i = 0

While (i < cat.Tables.count)
if left(cat.Tables(i).Name,3) = "tbl" then
      rs.Open "Delete * FROM " & cat.Tables(i).Name
      rs.close
end if
i = i + 1
Wend 

set rs = nothing

...eine sehr unperformante Lösung... es wäre Besser, alle Tabellen einmalig zu erfassen und dann jeweils einen etwas "längeren" SQLString mittels eines RecordsetObjekts abzuschiessen...       

Gruss Tom


----------



## Rosikopter (7. April 2003)

Danke für die Hinweise.

Vielleicht mach ichs auch mit temporärem zwischenspeichern einer leeren datenbank, und ersetzte die alte Datenbank immer mit der leeren.

...aber zu was anderem:

Wie kann ich den beenden Button rechts oben abfragen und noch weitere befehle beim betätigen von diesem hinzufügen. z.B. den Datenbankinhalt löschen,....


----------



## Thomas Darimont (7. April 2003)

...geht nicht (bzw. hab ichs noch nicht hinbekommen...;-)) diese Funktionalität hab ich immer so gelöst, dass ich den SchliessenButton ("X") nicht anzeigen lasse und statt dessen nen neuen Button "Beenden" auf dem Form platziere... bei diesem wird dann der Code hinterlegt-> Datenbankinhalt löschen;exit form; ... fertig...

Gruss Tom


----------



## Dario Linsky (7. April 2003)

Das mit dem Schliessen-Button des Formulars könntest Du mit dem QueryUnload-Ereignis des Formulars abfangen. Da kannst Du dann noch kurz vor Ende des Programms ein paar Dinge erledigen oder auch das Beenden ganz verbieten.


----------



## Rosikopter (7. April 2003)

den Vorschlag mit dem Schließen Button finde ich recht gut, nur wie tue ich den SchließenButton (x) auschalten???


----------



## Dario Linsky (7. April 2003)

In richtigem VB müsstest Du dazu die Formulareigenschaft ControlBox auf False setzen. In VBA bzw. Access Basic nennt sich die Eigenschaft "Schliessen-Schaltfläche" in der Registerkarte Format.

Normalerweise lohnt sich das komplette Ausblenden von dem Button aber eigentlich fast nur bei modalen Dialogformularen. Ist aber auch bei normalen Fenstern machbar.


----------



## hugamann (22. Januar 2005)

Hi,

ich möchte das ganze auch versuchen, jedoch nutze ich nicht VBA sonder VB 6.0.

Mit dem folgenden SQL-Befehl müsste das ja funktionieren:

```
DELETE FROM `nw_messages` WHERE `id` = '1'
```

Nun muss ich aber wissen, wie man das ganze in VB implementiert.

Ich habe es folgend versucht:


```
rs.Delete "DELETE FROM `nw_messages` WHERE `id` = '1' "
```

Das funktioniert leider nicht.
Wüsste ev. jemand, wie ich das mache ?

Bin leider nirgens so wirklich fündig geworden.
Vielen Dank schonmal für Eure Hilfe.

hugamann


----------

