AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Tabellen mit fremden NSX-Index öffnen und lösen

Tabellen mit fremden NSX-Index öffnen und lösen

Ein Thema von PASST · begonnen am 15. Aug 2005 · letzter Beitrag vom 15. Aug 2005
Antwort Antwort
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#1

Tabellen mit fremden NSX-Index öffnen und lösen

  Alt 15. Aug 2005, 13:30
Datenbank: dbase • Zugriff über: BDE 5.01
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.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Tabellen mit fremden NSX-Index öffnen und lösen

  Alt 15. Aug 2005, 15:33
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.
http://www.clicketyclick.dk/database...tml#DBF_STRUCT
Wenn dieses Byte auf 0 gesetzt wird, zeigt das an, dass kein Indexfile verwendet werden soll.
Zitat:
P.S.: Ich weiß, dass es nicht elegant ist, von zwei verschiedenen Anwendungen mit unterschiedlichen DBMS auf einen Datenstamm zuzugreifen.
Wenn du den Index wie oben beschrieben abklemmst, kann das seltsame Auswirkungen auf die Clipper-Anwendung haben.
Andreas
  Mit Zitat antworten Zitat
PASST

Registriert seit: 30. Mär 2005
Ort: Krefeld
325 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Tabellen mit fremden NSX-Index öffnen und lösen

  Alt 15. Aug 2005, 16:41
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Tabellen mit fremden NSX-Index öffnen und lösen

  Alt 15. Aug 2005, 16:53
Zitat von PASST:
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?
Wenn die BDE die dBase-Datei in der Mache hat, ist es zu spät.
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:
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;
Das ist alles sehr unsauber, aber dBase war ja noch nie eine richtige Datenbank und du musst
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)
Andreas
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz