gpt4 book ai didi

delphi - BDE 到 FireDAC : pack table, 重新生成索引

转载 作者:行者123 更新时间:2023-12-02 01:52:26 24 4
gpt4 key购买 nike

我们的一个旧程序使用 dBase 表和 .MDX 索引 - 其他系统也使用这些表,所以我们只能使用它们。我们希望在我们的软件中用 FireDAC 替换 BDE。 FireDAC 似乎没有提供 BDE 方法 DbiRegenIndex 和 DbiPackTable(分别重新生成索引和打包表) - 有没有办法使用 FireDAC 执行这些功能?

最佳答案

下面的代码显示了如何使用 MS dBase 驱动程序对 dBase 表进行索引。我有使用 Ado 组件,而不是 FireDAC,因为它更容易设置所有它们的属性在代码中,这样你就可以看到我在做什么。请注意,以及CREATE INDEX该驱动程序还支持DROP INDEX。参见例如https://learn.microsoft.com/en-us/sql/odbc/microsoft/create-index-for-paradox(适用于 Paradox,但也适用于 dBase)

要为该项目做好准备,您需要使用以下命令设置一个名为 DBFTest 的 ODBC 系统 DSNMS 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 驱动程序是否支持“pack table”命令,但您可能可以自己使用 INSERT INTO ... SELECT * FROM ...” 来将事件行复制到临时表中,然后从工作表中删除所有行,然后将它们从临时表中复制回来。

关于delphi - BDE 到 FireDAC : pack table, 重新生成索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48146958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com