Fehler beim Schreibzugriff auf dBase-IV-Dateien mit logischen Datenfeldern unter ADO
Bei der Umstellung einer Anwendung von BDE auf ADO treten Probleme mit sequentiellen Schreibzugriffen auf Ergebnismengen aus dBase-Tabellen auf, wenn diese Tabellen logische Datenfelder enthalten und mindestens ein Satz keinen Nullwert im logischen Feld enthielt.
Zum Nachvollzug des o.a. Sachverhalts habe ich mit der Datenbankoberfläche von Delphi die dBase-IV-Tabelle "TEST1.DBF" mit den Spalten "FELD1" (30 Zeichen) und FELD2 (Logisch) in dieser Spaltenreihenfolge erstellt. In diese Tabelle schreibe ich einen String - z.B. "blabla" - in alle Felder mit folgendem Code:
with ADODataSet1 do begin
CommandText := 'SELECT * FROM test1';
Close;
Open;
while not EOF do begin
Edit;
Fields[0].AsString := '000';
Next;
end;
Close;
end; // ADODataSet1
Solange FELD2 in allen Feldern leer ist - d.h. Null-Werte enthält - ist alles in Ordnung. Die Daten werden ohne Fehlermeldung in alle Sätze geschrieben. Enthält mindenstans ein Satz in FELD2 einen Wert - True oder False - werden Fehlermeldungen ausgegeben - z.B.: "Ungenügende oder inkorrekte Schlüsselspalteninformation: es sind zu viele Zeilen von der Aktualisierung betroffen" - und die gewünschten Daten werden oft nur in einem Teil der Sätze oder garnicht nach FELD1 geschrieben.
Der Fehler tritt auch auf,
- wenn CommandText in "SELECT FELD1 FROM test1'" geändert wird oder
- wenn die Tabelle zuvor nicht mit der Datenbankoberfläche sondern zur Laufzeit mit einer TADOCommand-Komponente und dem CommandText "CREATE TABLE TEST2.DBF (FELD1 CHAR(30),FELD2 LOGICAL)" erzeugt wurde.
CanModify war in allen Fällen true.
Der Fehler tritt nicht auf, wenn der Schreibzugriff mit einer TADOCommand-Komponente über den CommandText "UPDATE TEST1 SET FELD1=''3333''" erfolgt.
Als Provider verwende ich den Microsoft OLE DB Provider for ODBC Drivers.
Der Connenction-String lautet: "Provider=MSDASQL.1;Persist Security Info=False;User ID=ADMIN;Data Source=dBASE-Dateien;Connect Timeout=15;Locale Identifier=1031;Initial Catalog=D:\Projekte\Delphi5\Tests\ado"
Hat jemand für das o.a. Verhalten eine Erklärung und/oder weiß jemand, wie man TADODataSet zu korrekten sequentiellen Schreibzugriffen in einer Datenmenge "überreden" kann oder ist das ein Bug in Delphi oder im Microsoft-ODBC-Treiber???????
Bei der Umstellung einer Anwendung von BDE auf ADO treten Probleme mit sequentiellen Schreibzugriffen auf Ergebnismengen aus dBase-Tabellen auf, wenn diese Tabellen logische Datenfelder enthalten und mindestens ein Satz keinen Nullwert im logischen Feld enthielt.
Zum Nachvollzug des o.a. Sachverhalts habe ich mit der Datenbankoberfläche von Delphi die dBase-IV-Tabelle "TEST1.DBF" mit den Spalten "FELD1" (30 Zeichen) und FELD2 (Logisch) in dieser Spaltenreihenfolge erstellt. In diese Tabelle schreibe ich einen String - z.B. "blabla" - in alle Felder mit folgendem Code:
with ADODataSet1 do begin
CommandText := 'SELECT * FROM test1';
Close;
Open;
while not EOF do begin
Edit;
Fields[0].AsString := '000';
Next;
end;
Close;
end; // ADODataSet1
Solange FELD2 in allen Feldern leer ist - d.h. Null-Werte enthält - ist alles in Ordnung. Die Daten werden ohne Fehlermeldung in alle Sätze geschrieben. Enthält mindenstans ein Satz in FELD2 einen Wert - True oder False - werden Fehlermeldungen ausgegeben - z.B.: "Ungenügende oder inkorrekte Schlüsselspalteninformation: es sind zu viele Zeilen von der Aktualisierung betroffen" - und die gewünschten Daten werden oft nur in einem Teil der Sätze oder garnicht nach FELD1 geschrieben.
Der Fehler tritt auch auf,
- wenn CommandText in "SELECT FELD1 FROM test1'" geändert wird oder
- wenn die Tabelle zuvor nicht mit der Datenbankoberfläche sondern zur Laufzeit mit einer TADOCommand-Komponente und dem CommandText "CREATE TABLE TEST2.DBF (FELD1 CHAR(30),FELD2 LOGICAL)" erzeugt wurde.
CanModify war in allen Fällen true.
Der Fehler tritt nicht auf, wenn der Schreibzugriff mit einer TADOCommand-Komponente über den CommandText "UPDATE TEST1 SET FELD1=''3333''" erfolgt.
Als Provider verwende ich den Microsoft OLE DB Provider for ODBC Drivers.
Der Connenction-String lautet: "Provider=MSDASQL.1;Persist Security Info=False;User ID=ADMIN;Data Source=dBASE-Dateien;Connect Timeout=15;Locale Identifier=1031;Initial Catalog=D:\Projekte\Delphi5\Tests\ado"
Hat jemand für das o.a. Verhalten eine Erklärung und/oder weiß jemand, wie man TADODataSet zu korrekten sequentiellen Schreibzugriffen in einer Datenmenge "überreden" kann oder ist das ein Bug in Delphi oder im Microsoft-ODBC-Treiber???????
Comment