2009-03-17 3 views
3

Я в настоящее время тестирования с:Delphi ClientDataSet только для чтения

  1. SQLConnection, который направлен в сторону базы данных IB.
  2. SQLDataset, который имеет поле SQLConnection, установленное выше.
  3. DatasetProvider, который имеет SQLDataset в (2) в качестве значения поля Dataset.
  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); // <<<<<< 

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

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

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

+0

Как открыть ClientDataSet? Метод GetCurrEmployee использует только SQLDataSet. – mjn

+0

В ответ на mjustin, когда свойство DataSetProvider назначено ClientDataSet, ClientDataSet будет активным (он будет иметь метаданные в дополнение к любым данным, содержащимся в свойстве Data). Активный ClientDataSet открыт. –

ответ

0

Проверьте LiveMode объект TIBDataSet.

4

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

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

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

+0

+1 за отличный ответ, и так рад видеть вас здесь. Будет фантастически, если вы вносите свой вклад в СО! – Argalatyr

Смежные вопросы