Как использовать TClientDataSet с представлением SQL Server? (Или альтернатива)

В моей форме у меня есть ссылка TADOQuery,TDataSetProvider,TClientDataSet,TDataSource,TDBGrid.

AdoQuery использует представление SQL Server для запроса данных

AdoQuery.SQL:

Select * from vu_Name where fld=:fldval

Vu_Name:

SELECT * FROM  t1 INNER JOIN t2 ON t2.fld1 = t2.fld1

в моей dbgrid доступны для редактирования только столбцы в таблице t1 (требуется обновление только t1)

Каковы возможные (самые быстрые) способы применения обновлений обратно на сервер? ClientDataSet.ApplyUpdates(0); // not working

Спасибо.


person Ranga MK    schedule 11.02.2013    source источник
comment
просто для интереса, есть ли необходимость в TDatasetprovider и TClientdataset, или вам тоже подойдет отключенный набор записей? etutorials.org/Programming/mastering+delphi+7/   -  person bummi    schedule 11.02.2013
comment
Спасибо. Но я думаю, что это не работает, когда quarry использует представление, которое объединяет несколько таблиц для извлечения данных.   -  person Ranga MK    schedule 13.02.2013
comment
Вам может понадобиться TCustomADODataSet(DataSet).Properties['Уникальная таблица'].Value := 'T1';   -  person bummi    schedule 13.02.2013
comment
Свойство «Уникальная таблица» упоминается в msdn, но в моем проекте я не смог установить или прочитать свойство «уникальная таблица». Также я обнаружил, что свойство уникальной таблицы влияет только на операцию удаления (а не на вставку или обновление). так что это не работает для меня. Но работа с одной таблицей, я согласен, это самый короткий (отключенный) метод. Спасибо.   -  person Ranga MK    schedule 13.02.2013


Ответы (1)


TDataSetProvider имеет событие OnGetTableName, в котором вы должны установить для параметра TableName значение t1. Таким образом, провайдер знает, где хранить измененные значения.

Вы должны убедиться, что изменены только поля t1, так как TDataSetProvider будет обновлять только одну таблицу. Конечно, у вас могут быть разные имена таблиц для разных вызовов ApplyUpdates. Узнать об измененных полях можно в параметре DataSet.

Если вы хотите обновить более одной таблицы, вы должны реализовать OnUpdateData, что дает вам всю свободу со всей ответственностью.

person Uwe Raabe    schedule 11.02.2013
comment
Это работает. Спасибо. Для других, у которых такая же проблема, это то, что я сделал. clientDataset.applyupdates; //работает :) - person Ranga MK; 13.02.2013