Можно ли использовать UniDac как ADO Briefcase ?

Обсуждение возникших проблем, предложений и ошибок UniDAC компонентов
Ответить
Valery.B
Сообщения: 11
Зарегистрирован: Пн 04 июл 2016 15:13

Можно ли использовать UniDac как ADO Briefcase ?

Сообщение Valery.B » Пн 04 июл 2016 15:20

Добрый день.

Я хочу сохранить данные из запроса в VirtualTable, и предоставить VirtualTable для редактирования пользователю.
После редактирования, внести изменения в БД.
Можно ли это сделать в UniDac ?

На ADO это делалось примерно так:

Код: Выделить всё

ADOQuery.SaveToFile('C:\File.Bin');
MemDataSet.LoadFromFile('C:\File.Bin');
ADOQuery.Free;
...
ADOQuery.Create;
ADOQuery.SQL.Text : = 'Select * from table1';
ADOQuery.LoadFromFile('C:\File.Bin');
ADOQuery.Post.
Я пытаюсь использовать BatchMove в режиме AppendUpdate, он почти работает, но не может удалять записи.

Код: Выделить всё

B:=TCRBatchMove.Create(nil);
 b.Mode:=bmAppendUpdate;
try
 TempQuery:=TUniQuery.Create(Nil);
  try
   B.Source:=VirtualTable;
   B.Destination:=TempQuery;
   TempQuery.CachedUpdates:=True;
   TempQuery.Connection:=Self.Connection;
   TempQuery.SQL.Text:='Select * from table1';
   TempQuery.Open;
   B.Execute;
   TempQuery.ApplyUpdates;
  Finally
   TempQuery.Free;
  end;
 B.Free

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Можно ли использовать UniDac как ADO Briefcase ?

Сообщение Alexp » Ср 06 июл 2016 13:47

Добрый день,

В режиме AppendUpdate записи добавляются либо обновляются. Если вы хотите чтобы идентичные записи удалялись Вам необходимо использовать режим bmDelete

Valery.B
Сообщения: 11
Зарегистрирован: Пн 04 июл 2016 15:13

Re: Можно ли использовать UniDac как ADO Briefcase ?

Сообщение Valery.B » Чт 07 июл 2016 10:12

Вообще, я хочу что бы получился клон.
Я не знаю, что именно сделает пользователь - удалит, изменит или добавит данные.

Смысл всего этого - пользователь редактирует данные без соединения с БД, а потом вносит изменения в БД.
В ADO и ClientDataSet это было возможно.
Как один из вариантов я пробовал сделать это через BatchMove.

Вот так это делается в ADO: http://www.sql.ru/articles/mssql/2005/122703ado.shtml#7

Возможно ли сделать это в UniDac ?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Можно ли использовать UniDac как ADO Briefcase ?

Сообщение Alexp » Чт 07 июл 2016 13:33

Если вы хотите работать с данными локально, вам нет необходимости использовать такой сложный алгоритм. Достаточно включить опцию CachedUpdates. В этом случае данные будут редактироваться, добавляться и удаляться в DataSet без отправки в БД. Для сохранения данных в БД необходимо вызвать метод ApplyUpdate. Если вам необходимо отключать соединение, то вам также требуется включить опцию DisconnectedMode.

Valery.B
Сообщения: 11
Зарегистрирован: Пн 04 июл 2016 15:13

Re: Можно ли использовать UniDac как ADO Briefcase ?

Сообщение Valery.B » Чт 07 июл 2016 13:59

Спасибо за ответ.
Но если я правильно понимаю, то у компонента TUniQuery нету метода .LoadFrom*.
Но LoadFrom* - есть только Virtual Table.
Таким образом, я не смогу закешировать результаты запросов в тех случаях, когда это нужно. По этому, приходиться использовать такой сложный механизм.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: Можно ли использовать UniDac как ADO Briefcase ?

Сообщение Alexp » Пн 11 июл 2016 12:43

Если вам необходимо сохранять\загружать данные на\с файла, и полностью менять их в DataSet, Вы можете в режиме CashedUpdate удалять все данные из DataSet, а потом заливать все данные из VirualTфble с помощью CRBatchMove.

Ответить