Die Dokumentation ist sich nicht einig über die maximale Dateigröße unter Xbase++
Sicher ist, dass man für mehr als 1 GB DBF Dateien etwas tun muss, ähnlich wie unter Clipper auch.
Allerdings wird nichts gelinkt, sondern so der Datenbanktreiber (hier NTX) angepaßt:
Code: Alles auswählen
#include "DMLB.CH"
#include "DBFDBE.CH"
#include "ntxdbe.ch"
... im Code oder in der DBESYS ...
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0x7FFFFFFF ) // nötig für 2GB Dateien
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x7FFFFFFF )
DbeSetDefault( "DBFNTX" )
Code: Alles auswählen
? "Angefordert mit 0xFFFFFFFF"
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0xFFFFFFFF ) // gibt das 4 GB Dateien ?
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
? "Angefordert mit 0x7FFFFFFF"
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0x7FFFFFFF ) // nötig für 2 GB Dateien
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x7FFFFFFF )
Code: Alles auswählen
#include "XBP.CH"
#include "DMLB.CH"
#include "DBFDBE.CH"
#include "ntxdbe.ch"
#include "Error.ch"
PROCEDURE DbeSys()
IF !DbeLoad( "DBFDBE", .T. )
ALERT( MSG_DBFDBE_NOT_LOADED, { "OK" } )
ENDIF
IF !DbeLoad( "NTXDBE", .T. )
ALERT( MSG_DBFDBE_NOT_LOADED, { "OK" } )
ENDIF
IF !DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
ALERT( MSG_DBFNTX_NOT_CREATED, { "OK" } )
ENDIF
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
DbeSetDefault( "DBFNTX" )
RETURN
PROCEDURE Main
local cFormat := "999,999,999,999,999"
local aStru := {{"Test","C",1000,0}}
local nDauer
local x, cDB
set date german
set century on
set alternate to Protokoll.txt
set alternate on
nDauer := seconds()
for x := 1 to 2
do case
case x = 1
cDB := "TestDB4G"
? "Angefordert mit 0xFFFFFFFF"
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
case x = 2
cDB := "TestDB2G"
? "Angefordert mit 0x7FFFFFFF"
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0x7FFFFFFF )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x7FFFFFFF )
end
?
? "Erzeuge",cDB," DBF:", DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET ),;
" NTX:", DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET )
?
dbcreate( cDB, aStru )
use (cDB) NEW
if neterr()
? "NetErr() meldet Fehler bei ",cDB
inkey(10)
quit
endif
if ! flock()
? "flock() fehlgeschlagen ",cDB
inkey(10)
quit
endif
?
? time()
?
? "Test DBF ",cDB, " ",alias(), " Select: ", select()
?
? "Feldanzahl: ",transform(fcount(),cFormat)
? "Header(): ",transform(header(),cFormat)
? "RecSize(): ",transform(RecSize(),cFormat)
cls
@ 1,1 say "Test Start "+time()
@ 1+x,1 say cDB
do while NewRecord()
replace field->test with transform(recno(),cFormat)
@ 1+x,15 say transform(lastrec(),cFormat)
enddo
?
? "Lastrec(): ",transform(lastrec(),cFormat)
? "DbfFileSize:",transform(DbfFileSize(),cFormat)
? "fSize(): ",transform( FSize(cDB) ,cFormat)
?
next
nDauer := seconds() - nDauer
? "Programm beendet. Dauer: ",nDauer,"Sekunden"
? time()
set alternate to
inkey(0)
RETURN
*--------------------------------------------------------------------------------
FUNCTION DbfFileSize()
RETURN ( (RecSize() * LastRec()) + Header() + 1 )
*--------------------------------------------------------------------------------
Function BeschreibeFehler(oError)
? " - oError:args ", oError:args
? " - oError:description ", oError:description
? " - oError:genCode ", oError:genCode
? " - oError:subCode ", oError:subCode
? " - oError:subSystem ", oError:subSystem
? " - oError:OsCode ", oError:OsCode, " => ",DosErrorMessage(oError:OsCode)
return nil
*--------------------------------------------------------------------------------
Function ntrim(nWert)
return alltrim(str(nWert))
*--------------------------------------------------------------------------------
Function NewRecord()
local bSaveError, oError, IsOK := .t.
bSaveError := ErrorBlock()
ErrorBlock( {|e| Break(e)} )
BEGIN SEQUENCE
dbAppend()
if neterr()
? "NetErr() meldet Fehler bei dbAppend *** maximale Dateigröße erreicht ? "
IsOK := .f.
endif
RECOVER USING oError
ErrorBlock( bSaveError )
IsOK := .f.
? "Fehler bei DBAppend(), LastRec()=",lastrec()
BeschreibeFehler(oError)
? "Programm beendet nach Append-Fehler" // Besser Append beendet nach ...
END SEQUENCE
ErrorBlock( bSaveError )
return IsOK
Code: Alles auswählen
Angefordert mit 0xFFFFFFFF
Erzeuge TestDB4G DBF: -1 NTX: -1
11:56:27
Test DBF TestDB4G TESTDB4G Select: 1
Feldanzahl: 1
Header(): 66
RecSize(): 1.001
Fehler bei DBAppend(), LastRec()= 2145339
- oError:args {}
- oError:description D
- oError:genCode 8999
- oError:subCode 0
- oError:subSystem BASE
- oError:OsCode 0 => Der Vorgang wurde erfolgreich beendet.
Programm beendet nach Append-Fehler
Lastrec(): 2.145.339
DbfFileSize: 2.147.484.406
Angefordert mit 0x7FFFFFFF
Erzeuge TestDB2G DBF: 2147483647 NTX: 2147483647
11:57:34
Test DBF TestDB2G TESTDB2G Select: 2
Feldanzahl: 1
Header(): 66
RecSize(): 1.001
Fehler bei DBAppend(), LastRec()= 2145339
- oError:args {}
- oError:description
- oError:genCode 8999
- oError:subCode 0
- oError:subSystem BASE
- oError:OsCode 0 => Der Vorgang wurde erfolgreich beendet.
Programm beendet nach Append-Fehler
Lastrec(): 2.145.339
DbfFileSize: 2.147.484.406
Programm beendet. Dauer: 133,28 Sekunden
11:58:41
Code: Alles auswählen
Lastrec(): 2.145.339
DbfFileSize: 2.147.484.406
Lastrec(): 2.145.339
DbfFileSize: 2.147.484.406
auf der Festplatte je nach Header- und Satzlänge etwas darunter liegt.
Ich hoffe, dass wir mit Arctica dann SQLite auch als lokale Datei nutzen können.