带有ms访问索引的delphi在Table.indexName中不可用



我使用delphi7和MS Access。

当我试图在表字段IndexName中放入索引时,我会收到以下消息:

当前提供程序不支持索引所需的接口功能

ConnectionString:

rovider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=D:InformatiqueProgrammes personnelsMyDataBase.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False

我使用ADO express。

我只想对DBGrid中的数据进行排序。当我用OnTitleClick事件中的函数排序点击网格标题时,我会对其进行排序

Table.Field.sort:='MySortedField ASC';

但我想在打开表格时把它分类。

我似乎无法使用创建的MS Access数据库索引。是我遗漏了什么,还是MS Access索引无法与Delphi7一起使用?

以下D7项目支持按列排序,而不会遇到

当前提供程序不支持索引功能所需的接口

您报告的问题。请注意,我只在包含专用字符类型字段,如Char(20(

创建一个新的D7项目,包含:

  • 配置为连接到您的Access的TAdoConnection数据库

  • 使用TAdoConnection 的TAdoTable和TAdoCommand

  • TDataSource和TDBGrid,用于显示TAdoTable 的内容

添加FormCreate、FormClose和DBGrid1TitleClick事件处理程序,如下所示DropTable方法。

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
AdoTable1.IndexFieldNames := Column.FieldName;
end;
procedure TForm1.DropTable;
begin
try
AdoCommand1.CommandText := 'Drop Table ATest;';
AdoCommand1.Execute;
except
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if AdoTable1.Active then
AdoTable1.Close;
DropTable;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//  the following is just to ensure that AdoTable1 is closed
//  before we attempt to recreate and populate the table
if AdoTable1.Active then
AdoTable1.Close;
try
AdoCommand1.CommandText := 'Drop table ATest;';
AdoCommand1.Execute;
except
end;
try
AdoCommand1.CommandText := 'CREATE TABLE ATest( F1 Char(20) NOT NULL, F2 Char(20) NOT NULL, F3 Char(20) NOT NULL);';
AdoCommand1.Execute;
except
end;
AdoTable1.Open;
AdoTable1.InsertRecord(['Row1F1', 'A', 'B']);
AdoTable1.InsertRecord(['Row3F1', 'B', 'A']);
AdoTable1.InsertRecord(['Row2F1', 'C', 'C']);
end;

设置";停止语言异常";在调试器选项中将标志设为false然后编译并运行该项目。它删除并重新创建ATest表并用三排来普及它。单击三个列标题中的一个时它根据单击的列对数据进行排序。注意中的代码

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
AdoTable1.IndexFieldNames := Column.FieldName;
end;

这会忽略列标题中的实际文本,因为这可能有所不同并使用单击的列的FieldName属性。

此示例项目避免了使用自定义Order By子句,如我之前的一条评论中所建议的(已删除(。

如上所述,我只针对Access表测试了代码只包含字符类型字段,并且您需要针对希望支持的任何其他列类型测试代码。显然,避免按列排序实际上不起作用的列类型对网格进行排序是微不足道的。

至少我使用ADOCommand并根据代码构建一个表,如果acces不可用,这些表可能会很有用。我想要的是打开表格,按照我想要的方式对冒号进行排序。看过你的例子后,我记得在我的商店软件中,我确实把它整理好了。看了一眼之后,我看到了20年前我做的

在FormActivate中,我有这样的代码,现在当我打开表单时,冒号的顺序很好。

ADOTable.Sort:=DBGrid6.Columns[3].FieldName;
DBGrid6.Columns[3].Title.Color:=clYellow;

案子结束了,我学到了更多。谢谢,祝你一周愉快。

最新更新