Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

DBASE -> SQL Synchronisation

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1298
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

DBASE -> SQL Synchronisation

Beitrag von Rudolf » Fr, 09. Dez 2016 10:07

Hallo,

wer könnte sowas benötigen :

SQL Synchronisation welche in bestimmten Intervallen DBF Dateien in SQL Tabellen überträgt und synchronisiert (update, delete, append).
Dabei muss man nur die zu überwachende Datei in ein Dictionary eintragen, zusätzlich benötigte Felder und Index werden automatisch ergänzt und bei jeder Synchronisiation überprüft. Auch die gespiegelten SQL Tabellen am SQL Server werden automatisch angelegt. Strukturänderungen werden auch autom. nachgeführt. Funktioniert mit verschiedenen SQL Servern, derzeit getestet mit MySQL, PostgreSQL geht sicher auch, hab ich aber nicht getestet. Könnte auch eine Version ohne ODBC mit MYLIBSQL machen. In der jeweiligen Anwendung muss nur beim Öffnen der jeweiligen Datei mit DbRegisterClient(SyncDB) die Registrierung von Updates aktiviert werden. Am besten geht es mit einem Data Dictionary wie ich es verwende, da geht alles automatisch. Funktioniert mit allen XBase++ Versionen und verwendet SQLEXPRESS, eXpress++,OT4XB und die Tools. Das Programm läuft im Hintergrund in der Taskbar. Sourcecode bei Bedarf verfügbar, aber unkommentiert.

Grüße
Rudolf

qtek1650
Rookie
Rookie
Beiträge: 2
Registriert: So, 18. Dez 2016 21:12

Re: DBASE -> SQL Synchronisation

Beitrag von qtek1650 » So, 18. Dez 2016 21:42

Schönen Abend!,

"ich" könnte "soetwas" dzt recht gut "gebrauchen", vor allem den source-code (welche Sprache/DB auch immer), um xBase einmal besser zu verstehen; ich programmiere seit ca 25 Jahren vor allem die MS .NET Sprachen, früher C/C++; als Datenbank verwende ich seit gut 15 Jahren die SQL Server von Microsoft bzw. MySQL im Unix-Bereich;

meine dzt Beschäftigung besteht darin, einem vorhandenen (kommerziellen) CRM-Produkt, welches als Datenbank Xbase benützt, iS Statistik u Auswertungen auf die Sprünge zu helfen, da die mitgelieferten "Auswertungen" seinerzeit scheinbar von einem Gehirnakrobaten entworfen wurden, welcher offensichtlich keinen besonderen Zugang zu wirtschaftlichen Aspekten hatte...

Ich habe dzt einen SQL Server (MS 2008) soweit gebracht, dass er die einzelnen dbf-Files als eine Datenbank mit Tabellen lesen kann und "sich" derart "hilft", dass er sich von diesen Xbase-dfs's jeweils eine lokale Kopie zuerst erzeugt und in weiterer Folge diese bezügl. d Daten auch synchron hält. (eigentlich genau das, was Dein/Ihr Artikel auch beschreibt)

Mein Problem ist, dass bei ein paar wenigen dbf's - unter welchen sich LEIDER auch eine wichtige befindet - der Cursor des SQL-Servers "stoplert"; und zwar an einem (ersten) Record, welcher in der Quell-Datei (dem dbf-File) angeblich als "DELETED RECORD" markiert ist; nachfolgend die Fehlermeldung d SQL2008 im Detail:

(MS Sql2008 IDE + Linked Server "remote" basierend auf "Microsoft.ACE.OLEDB.12.0")
".... für den Verbindungsserver 'remote' hat die Meldung 'Datensatz ist gelöscht.' zurückgeben.
".... Der OLE DB-Anbieter 'Microsoft.ACE.OLEDB.12.0' für den Verbindungsserver 'remote' hat die Meldung 'Der Suchschlüssel wurde in keinem Datensatz gefunden.' zurückgeben."

Ich habe daraufhin versucht, eine Kopie der dbf-Files (d remote-Servers, di im wesentlichen ja das Verzeichnis mit den ca 250 dbf-Files) zu "packen", in der Hoffnung, das dann solche, als "deleted record" markierte Datensätze entfernt werden ... ohne Erfolg;

auch der Versuch, mit einem ADO Treiber f Xbase der Sache Herr zu werden, ist gescheitert, da der ADO Treiber ebenfalls genau an dieser Stelle die Zusammenarbeit verweigert; (https://www.cdata.com/drivers/xbase/download/ado/)

so, nun ist guter Rat teuer ... und bin ich so im Zuge meiner google/internet-Recherchen letztlich bei diesem Beitrag "gelandet" ... und darf 2 Fragen stellen:

(1) eine Idee, wie man so einen "deleted record" los wird? - bzw. einen Tip, wie man eine solche Tabelle trotzdem "angreifen" - dh. in einem Curosr (mit meinen Tools) darstellen kann

(2) macht es Sinn, Ihren/Deinen Source-Code für ein tieferes Verständnis von Xbase zu lesen, bzw. kann man mit diesem dieses Problem in den Griff bekommen?

Ich bedanke mich jetzt schon für eine Antwort;))

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1921
Registriert: Fr, 08. Feb 2008 21:29

Re: DBASE -> SQL Synchronisation

Beitrag von georg » Mo, 19. Dez 2016 7:26

Guten Morgen,


in allen dBase-Dialekten (soweit mir bekannt) werden Sätze nicht physisch gelöscht, sondern als gelöscht gekennzeichnet. Um diese Sätze loszuwerden gibt es den Befehl "dbPack()", der allerdings für die Dauer des Zugriffs exklusiven Zugriff auf die Datei benötigt.

Falls Index-Dateien mit der DBF verbunden sind, macht es aus meiner Erfahrung Sinn, diese anschliessend neu aufzubauen.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1298
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: DBASE -> SQL Synchronisation

Beitrag von Rudolf » Mo, 19. Dez 2016 9:29

Hallo qtek (Name wäre netter ;-)
nach dem packen ist der markierte Datensatz auch physikalisch weg. Ich kenne die Methode nicht mit der Du von SQL auf die DBF zugreifst, aber die kann auch nicht bei einem Satz stolpern den es nicht mehr gibt, vermute hier ein anderes Problem. Ich denke auch nicht das Indexdateien beim Lesen vom SQL Server verwendet bzw. unterstützt werden, kann also auch nicht das Problem sein.
Würde mal eine Datei Satz für Satz ohne die gelöschten in einen neue kopieren und dann versuchen.
Aus meinem Sourcecode könntest Du für Dein Problem nichts lernen, ich greife nicht vom SQL Server aus auf die DBF zu sondern umgekehrt.
Grüße
Rudolf

qtek1650
Rookie
Rookie
Beiträge: 2
Registriert: So, 18. Dez 2016 21:12

Re: DBASE -> SQL Synchronisation

Beitrag von qtek1650 » Mo, 19. Dez 2016 13:20

an alle - Danke fd feedback

Bernd Reinhardt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 100
Registriert: So, 16. Apr 2006 11:12
Wohnort: Öhringen

Re: DBASE -> SQL Synchronisation

Beitrag von Bernd Reinhardt » Mo, 16. Jan 2017 19:18

Hallo

Toll, so ein Tool könnte ich auch benötigen.
Wie groß dürfen die Memofelder auf dem SQL-Server sein.
Microsoft Express und mysql und mariadb sind hier wohl unterschiedlich.
Funktioniert das für alle Feldtypen, Datum, Logisch, Float und Integer?

Gruß
Bernd
Bernd Reinhardt
fa.reinhardt@gmx.de

Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1298
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: DBASE -> SQL Synchronisation

Beitrag von Rudolf » Mo, 16. Jan 2017 22:02

Halla Bernd,
Memofelder werden als BLOB angelegt, also lt. jeweiliger SQL Definition.
Grüße
Rudolf

Antworten