![]() |
Datenbank: dbase • Zugriff über: BDE 5.01
Tabellen mit fremden NSX-Index öffnen und lösen
Hi NG.
Delphi 4 (update 3), BDE 5.01 mit Zugriff auf dBase-Dateien mit SixNSX-Indexdateien. Ich muss auf eine bestehende dbf-Datenbasis zugreifen, die parallel von einer Clipper-Anwendung genutzt wird. Die dbf-Dateien sind per SixNSX indiziert. Dieser Index wird aber nicht von der BDE erkannt. Dadurch habe ich manchmal den Effekt, dass die Anwendung einige Tabellen nicht öffnen kann. Wenn ich allerdings mit dem Hilfsprogramm Datenbankoberfläche auf diese Tabellen zugreife, habe ich die Möglichkeit mit der Option 'öffnen und lösen' die Tabelle zu öffnen. Die Tabelle ist dann auch für die Anwendung und ebenso für alle weiteren Zugriffe durch die DBoberfläche erreichbar. (Ich vermute, dass die DBoberfläche irgendwo die Tabellendatei ändert.) Meine Frage ist nun, wie kann ich in Delphi dieses Öffnen und Lösen erzwingen, damit diese Fehlermeldung nicht auftaucht? Gruß Peter P.S.: Ich weiß, dass es nicht elegant ist, von zwei verschiedenen Anwendungen mit unterschiedlichen DBMS auf einen Datenstamm zuzugreifen. |
Re: Tabellen mit fremden NSX-Index öffnen und lösen
Ein DBase Datei trägt an Byte #28 ein Info, welche Art von Index-Datei dazugehört.
In folgender Doku wird das als Production index / Multiple index file oder MDX Flag bezeichnet. ![]() Wenn dieses Byte auf 0 gesetzt wird, zeigt das an, dass kein Indexfile verwendet werden soll. Zitat:
|
Re: Tabellen mit fremden NSX-Index öffnen und lösen
Dh. in der BDE wird u.a. dieses Byte #28 am Anfang eingelesen, um festzustellen mit welchen Bedingungen die Tabelle geöffnet werden muss. Da es sicherlich noch weitere Bedingungen gibt, die beim Öffnen einer dBase-Tabelle beachtet werden müssen, wie kann ich diese in Delphi vorab abfragen? Gibt es da schon vorgefertigte Routinen seitens Delphi?
Meine Idee dazu ist: Im DataSet.BeforeOpen-Ereignis diverse DBErrors vorab abzufangen und auszuwerten. Die Frage bleibt nur welche? Gruß PEter |
Re: Tabellen mit fremden NSX-Index öffnen und lösen
Zitat:
Die BDE ist auch nicht flexibel genug, um hier irgenwie einzugreifen. Du kannst im BeforeOpen Ereignis prüfen, ob diese Byte #28 <> 0 ist. Falls ja, könnte man die dBase-Datei kurz vorher patchen:
Delphi-Quellcode:
Das ist alles sehr unsauber, aber dBase war ja noch nie eine richtige Datenbank und du musst
var
fs : TfileStream; oldbyte , newbyte : char; begin fs : = TfileStream('test.dbf', fmReadWrite or fmShareDenyNone); try fs.Seek(28); fs.Readbuffer(oldbyte, 1); newbyte := #0; fs.Seek(28); fs.WriteBuffer(newByte, 1); finally fs.Free; end; end; jetzt das völlig veraltete Design ausbaden.... Du solltest erstmal prüfen, ob diese Byte an Position 28 überhaupt die Ursache deiner Probleme sind. (mit Hexeditor nachschauen, was drin steht, patchen und testen, ob die BDE dann damit klarkommt) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz