我们的一个旧程序使用dBase表和一个.MDX索引-其他系统也使用这些表,因此我们受其困扰。我们希望在我们的软件中将BDE替换为FireDAC。似乎FireDAC不提供BDE方法DbiRegenIndex和DbiPackTable(分别为重新生成索引和打包表)-是否可以使用FireDAC执行这些功能?
最佳答案
下面的代码显示了如何使用MS dBase驱动程序为dBase表建立索引。我有
使用Ado组件而不是FireDAC,因为它更容易设置所有组件
它们在代码中的属性,因此您可以看到我在做什么。请注意,以及CREATE INDEX
该驱动程序还支持DROP INDEX
。参见例如https://docs.microsoft.com/en-us/sql/odbc/microsoft/create-index-for-paradox
(这适用于Paradox,但也适用于dBase)
要为此项目进行设置,您需要使用以下命令设置一个称为DBFTest的ODBC系统DSN
MS dBase驱动程序。
将此Ado示例转换为FireDAC应该很简单。
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
btnCreateTable: TButton;
ADOQuery1: TADOQuery;
btnOpenTable: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
btnDropTable: TButton;
btnAddIndex: TButton;
procedure FormCreate(Sender: TObject);
procedure btnAddIndexClick(Sender: TObject);
procedure btnCreateTableClick(Sender: TObject);
procedure btnDropTableClick(Sender: TObject);
procedure btnOpenTableClick(Sender: TObject);
public
procedure CreatedBaseTable;
end;
[...]
procedure TForm1.FormCreate(Sender: TObject);
begin
AdoConnection1.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=False;Data Source=DBFTest';
end;
procedure TForm1.btnAddIndexClick(Sender: TObject);
var
Sql : String;
begin
if AdoQuery1.Active then
AdoQuery1.Close;
Sql := 'create index byID on dBaseTest (ID)';
AdoConnection1.Execute(Sql);
AdoQuery1.Open;
end;
procedure TForm1.btnCreateTableClick(Sender: TObject);
begin
CreatedBaseTable;
end;
procedure TForm1.btnDropTableClick(Sender: TObject);
var
Sql : String;
begin
Sql := 'drop table dBaseTest';
AdoConnection1.Execute(Sql);
end;
procedure TForm1.btnOpenTableClick(Sender: TObject);
begin
AdoQuery1.SQL.Text := 'select * from dBaseTest';
AdoQuery1.Open;
end;
procedure TForm1.CreatedBaseTable;
var
Sql : String;
i : Integer;
begin
Screen.Cursor := crSqlWait;
Update;
try
Sql := 'create table dBaseTest(ID int, AName char(20))';
AdoConnection1.Execute(Sql);
for i := 1 to 100 do begin
Sql := Format('insert into dBaseTest(ID, AName) values(%d, ''%s'')', [i, 'Name' + IntToStr(i)]);
AdoConnection1.Execute(Sql);
end;
finally
Screen.Cursor := crDefault
end;
end;
显然,要以这种方式“重新生成”索引,只需将它们删除(如果它们存在),处理所有异常(如果不存在),然后再次创建它们。
我不知道dBase驱动程序是否支持“打包表”命令,但是您可以自己使用INSERT INTO ... SELECT * FROM ...“复制活动表到临时表,然后删除所有表。工作表中的行,然后将其从临时表中复制回去。