delphi - 不能在 Delphi 5 中使用多个索引字段
问题描述
在使用超过 1 个这样的索引字段时:stocktable.INDEXFIELDnames:='NUMBER;PRE';
我收到错误消息:“字段 'NUMBER;PRE' 没有索引。
单独使用它们是有效的。
有人可以帮忙吗?
谢谢。
解决方案
您需要先将索引添加到表中,然后才能执行您想要的操作。
最好在与当前项目不同的项目中执行此操作,因为 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;
推荐阅读
- scala - git变量是什么轴?
- rxjs - RxJs - 我可以使用 BehaviorSubject 创建计时器吗?
- r - 提高 data.table 子集性能
- python - NUMBA:提前问题
- spring-boot - 如何将消息从 Spring Boot 推送和消费到独立的 JBoss Wildfly 10 Artemis Activemq?
- ssis - SSIS可以在Vertica(ELT)上放置命令计算吗
- php - 如何使我的简单 Datagrid 具有默认的前端样式?
- php - AJAX php代码插入NULL而不是向数据库输入值
- c# - 无法在 VB6 的外部 DLL 调用中写入文件
- html - 按钮有故障,我必须单击两次才能显示信息,并且照片没有正确对齐,这是为什么?