schneerunzel
Goto Top

Visual Foxpro: Zugriff auf eine alte Datenbank

Hallo zusammen,

ich habe noch eine uralte Visual Foxpro Datenbank, welche sich leider auch nicht kurzfristig ablösen lässt.

Leider habe ich von Visual Foxpro so gut wie keine Ahnung und benötige daher einmal Eure Hilfe:

In der Datenbank gibt es eine Tabelle die sich "lock" nennet. Da drin sind Sperren eingetragen, von einige einmal Nachts gelöscht werden sollen.
Für die Tabelle gibt es eine Datei mit dem Namen "lock.dbf" und eine "lock.cdx"

Wie gehe ich jetzt am besten per Script an diese Tabellen ran? Mein Ziel ist es, per Script einen Delet Befehl an die Tabelle zu senden und damit die gesperrten Datensätze wieder frei "zuschalten"
Meine erste Überlegung ist, die Datenbank per ODBC Verbindung in Powershell zu öffnen. Leider scheitere ich immer wieder daran, das ich die ODBC Verbindung nicht geöffnet bekomme
$conn = new-object system.data.odbc.odbcconnection
$conn.connectionstring = "DSN=Test;"  
$conn.open()

Ausnahme beim Aufrufen von "Open" mit 0 Argument(en):  "ERROR [IM002] [Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein   
Standardtreiber angegeben"  
Die Verbindung ist als User DSN angelegt:
unbenannt

Hat jemand eine Idee? Gerne auch in einer anderen Sprache.

Dann habe ich Abschließend noch eine allgemeine Frage:
die dbf ist soweit ich das verstanden habe die eigentliche Tabelle die cdx der Index dazu. Muss ich nach dem Löschen etwas tun, um den Index wieder neu aufzubauen oder ähnliches?

Vielen Dank vorab.

Content-ID: 1695894222

Url: https://administrator.de/contentid/1695894222

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

vossi31
vossi31 06.01.2022 um 15:50:12 Uhr
Goto Top
Moin,

meine dBase-Erfahrungen sind zwar von vor 30 Jahren aber ich würde mal folgendes versuchen:
- alles sichern
- die beiden lock-Files löschen
- testen
- wenn es läuft ist es gut, wenn nicht restore

Henning
schneerunzel
schneerunzel 06.01.2022 um 15:57:03 Uhr
Goto Top
Hallo,

leider dürfen nicht alle Einträge Gelöscht werden. Sondern nur welche die einen bestimmten Bereich betreffen. Daher würde ich da am liebsten per SQL rein gehen und eben nur die genannten löschen. Welche gelöscht werden sollen, das kann ich mir aus anderen Informationen ableiten (z.B. alles was älter ist wie 24 Stunden oder heute ist Sonntag, dann alles löschen, was Mo-Fr betrifft, etc.) Aber ich habe eben immer noch einträge die stehen bleiben müssen..
149569
Lösung 149569 06.01.2022 aktualisiert um 17:30:37 Uhr
Goto Top
Kommt drauf an welche Treiber auf deinem System vorhanden sind, dementsprechend den Connection-String an den Treiber anpassen
https://www.connectionstrings.com/dbf-foxpro/

$db = New-Object System.Data.OleDb.OleDbConnection
$db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Test;Extended Properties=dBASE IV;User ID=Admin;Password=;"  
$db.Open()
$cmd = $db.CreateCommand()
$cmd.Connection = $db
$cmd.CommandText = "Select * From MyTable"  
$da = New-Object System.Data.OleDb.OleDbDataAdapter
$da.SelectCommand = $cmd
$dt = New-Object System.Data.DataTable
[void]$da.Fill($dt)
$dt
$db.Close()
$db.Dispose()
Damit klappt das hier im Test. (ne Extra ODBC Datenquelle ist hierbei überflüssig)