加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 以编程方式查找MS-Access 2007表’字段索引’是否存在

发布时间:2020-12-15 09:16:58 所属栏目:大数据 来源:网络整理
导读:我的表Customers有一个索引的字段UserID. 现在,当我从delphi中删除此字段时,我将EOleExecption作为其索引字段. 我尝试使用以下代码: ObjCustomers := TADOTable.Create(nil); ObjCustomers.Connection := Connection; ObjCustomers.TableName := 'Customers
我的表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对于这种情况来说是假的.
此外,我不想做这样的事情:

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

在执行SQL查询之前,有什么方法可以检查字段是否为索引?

提前谢谢!

解决方法

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

使用TADOConnection.OpenSchema检索表索引:

var DataSet: TADODataSet;

DataSet := TADODataSet.Create(nil);
try
  Connection.OpenSchema(siIndexes,VarArrayOf([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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读