以编程方式查找 MS-Access 2007 表“字段索引”出席? TField.IsIndexedField 不起作用

发布于 2025-01-01 07:44:24 字数 766 浏览 5 评论 0原文

我的表 Customers 有一个已索引的字段 UserID。

在此处输入图像描述

现在,当我从以下位置删除此字段时delphi,我将 EOleExecption 作为其索引字段。 我尝试使用以下代码:

ObjCustomers := TADOTable.Create(nil);    
ObjCustomers.Connection := Connection;        
ObjCustomers.TableName := 'Customers';
ObjCustomers.Open;

if (ObjCustomers.FindField('UserID').IsIndexField) then
begin      
  ExecuteSQLStatements(['DROP INDEX UserID ON Customers']);    
end;

但是对于这种情况,这个 Tfield.IsIndexField 出现 False 。 此外,我不想做这样的事情:

try      
  ExecuteSQLStatements(['DROP INDEX UserID ON Customers']);    
except 
  on E: exception do    
end;

有什么方法可以让我在执行 SQL 查询之前检查该字段是否已索引?

提前谢谢!

My table Customers has a field UserID which is indexed.

enter image description here

Now when I am dropping this Field from delphi, I am getting EOleExecption as its a indexed field.
I tried with following code:

ObjCustomers := TADOTable.Create(nil);    
ObjCustomers.Connection := Connection;        
ObjCustomers.TableName := 'Customers';
ObjCustomers.Open;

if (ObjCustomers.FindField('UserID').IsIndexField) then
begin      
  ExecuteSQLStatements(['DROP INDEX UserID ON Customers']);    
end;

But this Tfield.IsIndexField is coming up False for this case.
Further I dont wanna do something like this:

try      
  ExecuteSQLStatements(['DROP INDEX UserID ON Customers']);    
except 
  on E: exception do    
end;

Is there any way so that I can check whether the field is Indexed, before executing SQL query?

Thankx in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

输什么也不输骨气 2025-01-08 07:44:24

GetIsIndexField 未由 TADODataSet 实现,结果将为 False

使用 TADOConnection.OpenSchema 检索表索引:

var DataSet: TADODataSet;

DataSet := TADODataSet.Create(nil);
try
  Connection.OpenSchema(siIndexes, VarArrayOf([Unassigned, Unassigned, Unassigned, Unassigned, 'Customers']), EmptyParam, DataSet);
  while not DataSet.Eof do begin
    ShowMessage(DataSet.FieldByName('INDEX_NAME').AsString);
    DataSet.Next;
  end;
finally
  DataSet.Free;
end;

要使此答案完整:
根据TLama的建议,您可以使用TADODataSet方法GetIndexNames
ADO 在内部使用 Command.ActiveConnection.OpenSchema(adSchemaIndexes...

function IsIndexField(DataSet: TADODataSet; FieldName: string): Boolean;
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    DataSet.GetIndexNames(SL);
    Result := SL.IndexOf(FieldName) <> -1;
  finally
    SL.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ObjCustomers: TADOTable;
begin
  ObjCustomers := TADOTable.Create(nil);
  ObjCustomers.Connection := Connection;
  ObjCustomers.TableName := 'Customers';

  if IsIndexField(TADODataSet(ObjCustomers), 'UserID') then
  begin
    Showmessage('Index');
    Connection.Execute('DROP INDEX UserID ON Customers');
  end
  else
    Showmessage('Not Index');

  // ObjCustomers.Open;
  ObjCustomers.Free;
end;

GetIsIndexField is not implemented by TADODataSet, and the result will be False.

Use TADOConnection.OpenSchema to retrieves table indexes:

var DataSet: TADODataSet;

DataSet := TADODataSet.Create(nil);
try
  Connection.OpenSchema(siIndexes, VarArrayOf([Unassigned, Unassigned, Unassigned, Unassigned, 'Customers']), EmptyParam, DataSet);
  while not DataSet.Eof do begin
    ShowMessage(DataSet.FieldByName('INDEX_NAME').AsString);
    DataSet.Next;
  end;
finally
  DataSet.Free;
end;

To make this answer complete:
As suggested by TLama you can use the TADODataSet method GetIndexNames.
ADO is internally using Command.ActiveConnection.OpenSchema(adSchemaIndexes...

function IsIndexField(DataSet: TADODataSet; FieldName: string): Boolean;
var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    DataSet.GetIndexNames(SL);
    Result := SL.IndexOf(FieldName) <> -1;
  finally
    SL.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ObjCustomers: TADOTable;
begin
  ObjCustomers := TADOTable.Create(nil);
  ObjCustomers.Connection := Connection;
  ObjCustomers.TableName := 'Customers';

  if IsIndexField(TADODataSet(ObjCustomers), 'UserID') then
  begin
    Showmessage('Index');
    Connection.Execute('DROP INDEX UserID ON Customers');
  end
  else
    Showmessage('Not Index');

  // ObjCustomers.Open;
  ObjCustomers.Free;
end;
孤凫 2025-01-08 07:44:24
VAR
 AdoTbl:TAdoDataset;
BEGIN
  AdoTbl:=TAdoDataset.Create(Self); // use TAdoDataset 
  AdoTbl.Connection  :=MyAdoConnection;
  AdoTbl.CommandType:=cmdTable; //Importent !!
  AdoTbl.CommandText:='Refx_Ceramics_Hist_PreHist'; //Tablename 

  AdoTbl.GetIndexNames(ListBox1.Items);
END;

这对我在 DelphiXE2 上有用

VAR
 AdoTbl:TAdoDataset;
BEGIN
  AdoTbl:=TAdoDataset.Create(Self); // use TAdoDataset 
  AdoTbl.Connection  :=MyAdoConnection;
  AdoTbl.CommandType:=cmdTable; //Importent !!
  AdoTbl.CommandText:='Refx_Ceramics_Hist_PreHist'; //Tablename 

  AdoTbl.GetIndexNames(ListBox1.Items);
END;

This works for me on DelphiXE2

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文