无法在Delphi 5中使用多个索引字段

时间:2019-02-19 20:03:02

标签: delphi

在使用多个索引字段时,如下所示:    stocktable.INDEXFIELDnames:='NUMBER; PRE';

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

分别使用它们是可行的。

有人可以帮忙吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

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

最好在与当前项目不同的项目中执行此操作,因为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,通过TDataSource,TQuery和多个TButton连接到TTable的TDBGrid和TDBNavigator(然后需要连接到单击处理程序)。我称该表为“ 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;