首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以编程方式找到MS 2007表“字段索引”存在吗?TField.IsIndexedField不工作

以编程方式找到MS 2007表“字段索引”存在吗?TField.IsIndexedField不工作
EN

Stack Overflow用户
提问于 2012-02-01 11:24:38
回答 2查看 1.4K关注 0票数 4

我的表客户有一个字段UserID,该字段是索引的。

现在,当我从delphi中删除这个字段时,我将EOleExecption作为一个索引字段。我尝试使用以下代码:

代码语言:javascript
复制
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对这个案子来说是错误的。,我不想做这样的事情:

代码语言:javascript
复制
try      
  ExecuteSQLStatements(['DROP INDEX UserID ON Customers']);    
except 
  on E: exception do    
end;

在执行SQL查询之前,是否有任何方法可以检查字段是否已被索引?

先发制人!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-01 12:36:11

GetIsIndexField不是由TADODataSet实现的,结果将是False

使用TADOConnection.OpenSchema检索表索引:

代码语言:javascript
复制
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...

代码语言:javascript
复制
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;
票数 4
EN

Stack Overflow用户

发布于 2019-08-13 19:06:17

代码语言:javascript
复制
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上适用于我

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9094964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档