Проблема с индексом Delphi 2006 TClientDataSet

Я использую ClientDataSet с DataSetProvider, связанным с локальным набором данных. Когда я хочу отредактировать данные в DataSet, я открываю ClientDataSet и добавляю к нему некоторые индексы. Закончив редактирование данных, я закрываю ClientDataSet. Все работает нормально, за исключением того, что когда я снова открываю ClientDataSet и выбираю индекс, он выдает исключение с сообщением "index 'xxx' not found". Что я делаю неправильно?

Вот код для открытия ClientDataSet:

 Application.CreateForm (TfrmCardDep, frmCardDep);
 try
  with DM.tblCCardDep do
   begin
    IndexDefs.Clear;
    if not Active then Open;
    AddIndex ('iDepID', 'DepID', []);
    AddIndex ('iDep', 'Dep', []);
    IndexName := 'iDep';
    FieldByName('Dep').DisplayLabel := 'Departament';
    FieldByName('Dep').DisplayWidth := 50;
    FieldByName('DepID').Visible := false;
   end;

  frmCardDep.ShowModal;
 finally
  if DM.tblCCardDep.Active then DM.tblCCardDep.Close;
  frmCardDep.Free; frmCardDep := nil;
 end;

DM.tblCCardDep — это набор данных ClientDataset.


person zoomz    schedule 20.09.2011    source источник
comment
Дайте нам более подробную информацию о вашей проблеме. РЕДАКТИРОВАТЬ: Не писать как комментарий. Отредактируйте свой пост для написания нового кода.   -  person Soner Gönül    schedule 20.09.2011


Ответы (2)


После первого раунда у вас есть IndexName на ClientDataSet. Когда IndexDefs отбрасываются, индекс, на который он ссылается, становится недействительным. Очистите IndexName перед повторным открытием набора данных, т. е. измените свой код следующим образом:

 [..]
 try
  with DM.tblCCardDep do
   begin
    IndexDefs.Clear;
    IndexName := '';      // <- here
    if not Active then Open;
    [..]

Или используйте что-то вроде этого: [..]

 try
  with DM.tblCCardDep do
   begin
    if not Active then Open;
    if IndexDefs.Count = 0 then
     begin
      AddIndex ('iDepID', 'DepID', []);
      AddIndex ('iDep', 'Dep', []);
      IndexDefs.Update;             // Update IndexDefs
      IndexName := 'iDep';
     end;
    FieldByName('Dep').DisplayLabel := 'Departament';
    [..]
person Sertac Akyuz    schedule 20.09.2011

Индексы клиентского набора данных всегда удаляются при закрытии клиентского набора данных. «Постоянный индекс» в контексте клиентского набора данных означает, что он остается в памяти, пока клиентский набор данных открыт:

Понимание индексов ClientDataSet

Индексы TClientDataset: временные или постоянные?

person Ondrej Kelle    schedule 20.09.2011