Delphi ClientDataset только для чтения - PullRequest
3 голосов
/ 17 марта 2009

Я сейчас тестирую с:

  1. SQLConnection, который указывает на базу данных IB.
  2. SQLDataset, для поля SQLConnection которого установлено значение, указанное выше.
  3. DatasetProvider, в котором значение SQLDataset в (2) является значением поля набора данных.
  4. ClientDataset с полем ProviderName, указывающим на провайдера в (3).

Я использую следующий метод (заимствованный у Алистера Кристи), чтобы получить данные ...

function TForm1.GetCurrEmployee(const IEmployeeID: integer): OleVariant; 
const 
  SQLSELEMP = 'SELECT E.* FROM EMPLOYEE E WHERE E.EMPLOYEEID = %s'; 
begin 
  MainDM.SQLDataset1.CommandText := Format(SQLSELEMP, [Edit1.Text]); 
  Result := MainDM.DataSetProvider1.Data; 
end;

Который заполняет DBGrid только одной записью. Однако, когда я вручную редактирую запись, нажимаю «Опубликовать», затем пытаюсь зафиксировать изменения, используя

MainDM.ClientDataset1.ApplyUpdates(0); // <<<<<< 

Бомба с сообщением «SQLDataset1: невозможно изменить набор данных только для чтения».

Я проверил свойство ReadOnly провайдера и ClientDataset, и SQL не имеет соединений.

Что может быть причиной ошибки?

Ответы [ 2 ]

4 голосов
/ 11 июля 2009

Похоже, что ваше свойство ClientDataSet.Data заполняется из свойства Data объекта DataSetProvider. С описанной вами настройкой вы сможете просто вызвать ClientDataSet.Open, который будет получать данные из DataSetProvider.

Кстати, поведение DataSetProvider по умолчанию при вызове метода ClientDataSet.ApplyUpdates - отправка SQL-запроса к объекту соединения, а не к DataSet, из которого были получены данные (при условии однородного запроса). Убедитесь, что для свойства DataSetProvider.ResolveToDataSet не установлено значение true.

Наконец, на несвязанной заметке ваш код выше, кажется, открыт для атаки SQL-инъекцией (хотя я не проверял это). Безопаснее использовать параметр для определения предложения WHERE. Если кто-то введет в Edit1 следующее, у вас могут возникнуть проблемы (при условии, что InterBase использует синтаксис отбрасываемой таблицы): 1; работник удаленной таблицы;

0 голосов
/ 10 июня 2009

Проверьте LiveMode свойство TIBDataSet.

...