首页 > 解决方案 > 不能在 Delphi 5 中使用多个索引字段

问题描述

在使用超过 1 个这样的索引字段时:stocktable.INDEXFIELDnames:='NUMBER;PRE';

我收到错误消息:“字段 'NUMBER;PRE' 没有索引。

单独使用它们是有效的。

有人可以帮忙吗?

谢谢。

标签: delphi

解决方案


您需要先将索引添加到表中,然后才能执行您想要的操作。

最好在与当前项目不同的项目中执行此操作,因为 BDE 可能对此类操作非常挑剔,需要在表未使用时执行此操作。

  • 关闭现有项目并重新启动 Delphi
  • 开始一个新项目
  • 在项目的表单上放置一个 TQuery 和一个 TButton
  • 将 TQuery 的Database名称设置为您的数据库的名称

然后像这样为 TButton 定义 OnClick 处理程序:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.SQL.Text :='Create Index ByNumberAndPre on  StockTable (Number,Pre) ';
  Query1.ExecSQL;
  ShowMessage('Done');
end;

当然,这假定表的名称(在数据库中)是“StockTable”。

'(Number,Pre)' 指定索引中列的顺序。请注意,分隔符是逗号,而不是分号。

编译并运行项目并单击按钮。假设您收到“完成”消息,请关闭此项目并重新打开您现有的项目。现在,您应该能够单击 TTable 的IndexName字段并ByNumberAndPre从下拉列表中进行选择。

顺便说一句,这些天来,关于在 BDE 表上使用 SQL 的最佳参考可能在这里: https ://docs.microsoft.com/en-us/sql/odbc/microsoft/create-index-for-paradox?view=sql -server-2017

下面是一个示例项目的代码,可以让您尝试这个想法。您需要为空白表单添加一个 TTable、一个 TDBGrid 和 TDBNavigator,通过一个 TDataSource、一个 TQuery 和一些 TButton(然后需要连接到点击处理程序)连接到 TTable。我已将表命名为“StockTable2”,以便该项目不会干扰您现有的表。

procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.SQL.Text :='Create Index MyPrimary on  StockTable (Number,Pre) ';
  Query1.ExecSQL;
end;

procedure TForm1.btnCreateTableClick(Sender: TObject);
begin

  Query1.SQL.Text :='Create Table "Stocktable2.db" ('#13#10
+ ' id int, pre char(8), number int, CONSTRAINT z PRIMARY KEY (id))';
  Query1.ExecSQL;

 Query1.SQL.Text := 'Create Index ByNumberAndPre on  StockTable2 (Number,Pre)';
 Query1.ExecSQL;
end;

procedure TForm1.btnDropClick(Sender: TObject);
begin
  Query1.SQL.Text :='drop table Stocktable2';
  Query1.ExecSQL;
end;

procedure TForm1.btnOpenClick(Sender: TObject);
begin
  Table1.Open;
end;

procedure TForm1.btnAddClick(Sender: TObject);
var
  i,
  n : Integer;
begin
  for i := 1 to 100 do begin
    n := Trunc(Random(100));
    Table1.InsertRecord([i, Chr(Ord('A') + Random(26)), n]);
  end;
end;

procedure TForm1.btnUseIndexClick(Sender: TObject);
begin
  Table1.IndexName := 'ByNumberAndPre';
end;

推荐阅读