在使用多个索引字段时,如下所示: stocktable.INDEXFIELDnames:='NUMBER; PRE';
我收到错误消息:“字段'NUMBER; PRE'没有索引。
分别使用它们是可行的。
有人可以帮忙吗?
谢谢。
答案 0 :(得分:0)
您需要先向表中添加索引,然后才能执行所需的操作。
最好在与当前项目不同的项目中执行此操作,因为BDE对这种操作可能非常挑剔,这需要在不使用表的情况下完成。
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;