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-Key: 1695894222

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

Printed on: April 25, 2024 at 10:04 o'clock

Member: vossi31
vossi31 Jan 06, 2022 at 14:50:12 (UTC)
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
Member: schneerunzel
schneerunzel Jan 06, 2022 at 14:57:03 (UTC)
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..
Mitglied: 149569
Solution 149569 Jan 06, 2022 updated at 16:30:37 (UTC)
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)