2010-09-25 16 views
7

In Delphi per Win32, come leggere e scrivere un file dbf in modo nativo, senza il BDE? So che ci sono alcuni componenti disponibili nel web, ma non ne ho mai usato nessuno, quindi non so quale scegliere (se esiste).Come leggere e scrivere dbf in modo nativo?

risposta

14

È possibile utilizzare ADO per accedere a un file DBF

Vedi THS codice di esempio (utilizzando un TAdoConnection e TAdoDataSet componenti).

var 
dbf_folder : string; 
begin 
    dbf_folder:='c:\bdd';//set your dbf folder location here 
    ADOConnection1.LoginPrompt:=false; 
    ADOConnection1.ConnectionString:=Format('Provider=Microsoft.JET.OLEDB.4.0;Data Source=%s;Extended Properties=dBase IV;',[dbf_folder]); 
    try 
    ADOConnection1.Connected:=True; 
    ADODataSet1.CommandText:='Select * from file.dbf'; //make your SQL query using the name of the dbf file 
    ADODataSet1.Open; 
    while not ADODataSet1.eof do 
    begin 
    //do your stuff here 
    //ADODataSet1.FieldByName('').AsString 
    ADODataSet1.Next; 
    end; 
    except 
    on E : Exception do 
     ShowMessage(E.Message); 
    end; 
end; 
+1

+1 per una soluzione Delphi "pronta all'uso" –

+0

Questo funziona solo per il mio scopo – eKek0

+0

errore: "errore di rete o disco" :( –

0

Non è difficile leggere un file DBF se non sono necessari gli indici. Il formato è piuttosto semplice. Un'intestazione seguita per registri di dimensioni fisse. C'è una bandiera in ogni registro che indica se è stata cancellata o meno. Suggerisco di cercare un componente che faccia ciò che vuoi. È possibile trovare alcuni in Torry's Delphi pages.

1

Ho usato Topaz da Software Science per molti anni prima di iniziare con Firebird. Era sempre una biblioteca eccellente, aveva un manuale fantastico e un buon supporto tecnico. Supporta gli indici e ha anche un'opzione in memoria. Penso che sarebbe una buona scelta.

+0

Purtroppo ho scoperto di recente (dopo che avevo già speso troppe ore sul codice di conversione) che non supporta valori NULL. Vengono automaticamente convertiti in stringhe vuote o 0 a seconda del tipo di campo. Questa caratteristica mancante ha reso Topaz completamente inutile per me. :-(Ora ho fatto domanda per la loro offerta di "60 giorni soddisfatti o rimborsati", spero che si attenano ad essa, così almeno riesco a recuperare quei 100 US $ Il tempo è già perso – dummzeuch

+0

Mi dispiace davvero che non fosse adatto Erano una compagnia molto professionale orientata al cliente quando mi occupavo di loro regolarmente, spero che la tua esperienza sia buona come la mia.Per ancora, mi dispiace di averti indicato in un vicolo cieco – jrodenhi

+0

jrodenhi: Certamente non è stata colpa tua, ho solo trovato la tua risposta dopo aver già stabilito che Topaz non ha fatto quello che mi serviva, ho postato questo commento per rendere gli altri consapevoli di questa mancanza, in modo che non perdano tutto il tempo che ho fatto – dummzeuch

8

Ho usato TDBF indietro quando stavo ancora lavorando con i file DBF (alcune applicazioni legacy). Lo uso ancora per la manutenzione di quelle app qui e là. È gratuito, ha molte funzioni e funziona bene.

+0

"libero" che significa LGPL in questo caso. Non va bene per le app commerciali. – dummzeuch

+0

Perché non dovrebbe essere buono per le app commerciali? Devi solo pubblicare il sorgente TDBF se lo modifichi; altrimenti puoi semplicemente collegare il codice .. – reiniero

+1

Se * lo * link * staticamente devi fornire non solo il codice sorgente tdbf ma la fonte completa del tuo programma. Al fine di collegare dinamicamente tdbf dovresti lavorare con i pacchetti. – dummzeuch

0

ADO non ha funzionato per me, ma sono riuscito ad aprire il mio file dbf utilizzando BDE:

Dal punto di accesso ai dati (o BDE, dipende dalla vostra versione di Delphi) sezione ho messo un TDatabase e, componenti TTable (puoi usare TQuery se vuoi).

Facendo doppio clic sul componente TDataBase ho aperto la finestra di dialogo di configurazione. Riempito il campo Nome con 'db_name' (il nome è arbitrario), nome driver = 'STANDARD', campo Parametri: 'PATH = C: \ Path \ To \ DBF_FILES \'. Quindi ho impostato Connesso = Vero.

Quindi nel componente TTable ho impostato DatabaseName = 'db_name' - quello che ho impostato nel componente TDataBase. E la proprietà TableName impostava "DB_FILE.dbf" che si trovava nella cartella specificata. Attivo = Vero.

si sa che cosa fare dopo

Problemi correlati