Программно найти MS-Access 2007 Таблица «Полевой индекс», чтобы присутствовать?TField.IsIndexedField не работает - PullRequest
4 голосов
/ 01 февраля 2012

Моя таблица Customers имеет поле UserID, которое индексируется.

enter image description here

Теперь, когда я удаляю это поле из 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?

Заранее благодарен!

1 Ответ

4 голосов
/ 01 февраля 2012

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;
...