W Delphi for Win32, jak odczytać i zapisać plik dbf w natywny sposób, bez BDE? Wiem, że niektóre elementy są dostępne w sieci, ale nigdy nie użyłem żadnego z nich, więc nie wiem, który wybrać (jeśli taki jest).Jak odczytać i zapisać dbf w natywny sposób?
Odpowiedz
Można użyć ADO dostępu do plików DBF
Zobacz ths przykładowy kod (przy użyciu TAdoConnection
i TAdoDataSet
komponenty).
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;
Nie jest trudno odczytać plik DBF, jeśli nie potrzebujesz indeksów. Format jest dość prosty. Nagłówek został zastosowany dla rejestrów o ustalonym rozmiarze. W każdym rejestrze znajduje się flaga wskazująca, czy została usunięta, czy nie. Sugeruję poszukiwanie komponentu, który robi to, co chcesz. Możesz znaleźć numer in Torry's Delphi pages.
Użyłem Topaz z Software Science przez wiele lat, zanim zacząłem pracę z Firebird. Zawsze była to doskonała biblioteka, miała świetny podręcznik i dobre wsparcie techniczne. Obsługuje indeksy, a nawet ma opcję w pamięci. Myślę, że byłby to dobry wybór.
Niestety dowiedziałem się niedawno (po tym, jak spędził już zbyt wiele godzin na kod konwersji), że nie obsługuje wartości NULL. Są automatycznie konwertowane na puste ciągi lub 0 w zależności od typu pola. Ta brakująca cecha sprawiła, że Topaz stał się dla mnie bezwartościowy. :-(Teraz ubiegam się o ich ofertę "60 dni zwrotu pieniędzy" Mam nadzieję, że pozostaną przy niej, więc przynajmniej otrzymam te 100 USD z powrotem. Czas już jest stracony – dummzeuch
Naprawdę przykro, że nie był odpowiedni Byli bardzo profesjonalną firmą zorientowaną na klienta, kiedy zajmowałem się nimi regularnie Mam nadzieję, że twoje doświadczenie jest tak dobre, jak moje Było mi przykro, że wskazałem ci ślepy zaułek – jrodenhi
jrodenhi: To z pewnością To nie była twoja wina, znalazłem twoją odpowiedź po tym, jak już ustaliłem, że Topaz nie zrobił tego, czego potrzebowałem. Wysłałem ten komentarz, aby inni wiedzieli o tym niedociągnięciu, aby nie tracili na nim tyle czasu, co ja. – dummzeuch
Użyłem tego, ale migrowałem do TDBF, głównie z powodu prędkości powody, pomimo ha ving kupił Apollo –
Kiedyś pracowałem z plikami DBF (niektóre starsze aplikacje). Nadal używam go do utrzymywania tych aplikacji tu i tam. Jest bezpłatny, ma wiele funkcji i działa dobrze.
"wolny" czyli LGPL w tym przypadku. Nie nadaje się do komercyjnych aplikacji. – dummzeuch
Dlaczego nie byłoby dobrze dla komercyjnych aplikacji? Musisz tylko opublikować źródło TDBF, jeśli je modyfikujesz; w przeciwnym razie możesz po prostu połączyć kod. – reiniero
Jeśli * statycznie * link to musisz podać nie tylko kod źródłowy tdbf, ale pełne źródło twojego programu. Aby dynamicznie łączyć tdbf, musisz pracować z pakietami. – dummzeuch
ADO nie działa dla mnie, ale udało mi się otworzyć pliku DBF przy użyciu BDE:
Z dostępu do danych (lub BDE, zależy od wersji Delphi) Sekcja I umieścić TDataBase, a komponenty TTable (możesz użyć TQuery, jeśli chcesz).
Po dwukrotnym kliknięciu komponentu TDataBase otworzyłem okno dialogowe instalacji. Wypełnione pole Nazwa z "db_name" (nazwa jest dowolna), nazwa sterownika = "STANDARD", pole Parametry: "PATH = C: \ Path \ To \ DBF_FILES \ '. Następnie ustawiam Connected = True.
Następnie w komponencie TTable ustawiam DatabaseName = 'db_name' - tę ustawioną w komponencie TDataBase. I właściwość TableName ustawiona "DB_FILE.dbf", która znajdowała się w określonym folderze. Aktywny = Prawda.
Wiesz, co robić dalej
+1 dla "out-of-the-box" rozwiązania Delphi –
To po prostu działa dla mojego celu – eKek0
błąd: "błąd sieci lub dysku" :( –