Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: ADDataMove - еще не дописаны?
ADDataMove - еще не дописаны?
Posted: 2007/03/13 11:26
 
ADDataMove - еще не дописаны?
Пытаюсь переслатьданные из одной таблицы в другую...
Exception на
{-------------------------------------------------------------------------------}
procedure TADAdaptedDataSet.ServerSetKey;
begin
{ TODO -cCLNT : To implement ServerSetKey }
raise Exception.Create('Not implemented');
end;
{-------------------------------------------------------------------------------}
когда ожидается полная реализация?
Re:ADDataMove - еще не дописаны?
Posted: 2007/03/14 04:16
 
Привет

Да, не все режимы ADDataMove поддерживаются.
1) Либо включите poClearDest или poClearDestNoUndo в опции. Но тогда приемник будет очищаться перед загрузкой.
2) Либо установите Mode в dmAlwaysInsert. Тогда записи будут добавлены к уже имеющимся в приемнике.
3) Либо напишите обработчик события OnFindDestRecord, который будет определять имеется ли исходная запись в приемнике.

Удачи,
Дмитрий
Re:ADDataMove - еще не дописаны?
Posted: 2007/03/14 06:14
 
Мне кажется лучше вопрос задать в это теме. ADDataMove будет ли подерживать специфические механизмы Oracle(OraLoader)? Это быстрая загрузка внешних данных из памяти. В стандартной поставке есть такая утилита он она загружает из текстового файла. В ODAC тоже есть OraLoader, немного странно написан но работает. Грузит данные из любого источника простым присвоением занчений колонкам и через каждые 100 записей скидывает их в таблицу.
Re:ADDataMove - еще не дописаны?
Posted: 2007/03/14 07:28
 
Привет

OraLoader пока не планируется. Но выможете использовать обычный INSERT и массивы параметров:


 with ADQuery1 do begin   SQL.Text := 'insert into tab values (:f1, ..., :fn)'   Params.ArraySize := 100;   for := 0 to Params.ArraySize do begin     Params[0].AsIntegers[i] := i;     .........     Params[n].AsStrings[i] := 'qweqweqwe';   end;   Execute(Params.ArraySize); end;



Данный способ обеспечивает очень высокую скорость вставки записей - раз в 50 быстрее в моем окружении.

Удачи,
Дмитрий
Re:ADDataMove - еще не дописаны?
Posted: 2007/03/14 10:11
 
Неужели этот способ быстрее вставки через StoredProc? Чтото сомненаюсь, мне за раз надо вставить примерно 50000 строк их 15 колоник, все поля numeric. OraLoader вставляет за 21-145 секунды, учитывая построение индекса. Вставка происходит каждые 15 минут и должна идти за минимальное время, раньше использовал SP, пришлось переписать на OraLoader.
Я не из праздного интереса спрашиваю, у меня достаточно много разных задач, которые сейчас крутятся на ODAC или BDE. Вот узнаю возможности продукта.
Re:ADDataMove - еще не дописаны?
Posted: 2007/03/14 10:18
 
Мне сложно оперировать конкретными цифрами. Просто попробуйте Вставляйте массивами по 10,000 элементов.
Re:ADDataMove - еще не дописаны?
Posted: 2008/01/14 05:38
 
Могули я при добавлении данных использовать следующую конструкцию

SQL.Add('INSERT INTO rawstartdata (DeviceType, FactoryNum, VehicleID, DateTimeUTC, StartType, iButton, DriverID)');
SQL.Add('SELECT (:f1, :f2, :f3, :f4, :f5, :f6, SELECT DriverID FROM ibuttons WHERE ID = :f7)');

С уважением
Александр
Re:ADDataMove - еще не дописаны?
Posted: 2008/01/15 01:11
 
Можно использовать любую параметризованную не-SELECT SQL команду.
Основное требование - команда должна иметь корректный синтаксис.
Не знаю какая у вас СУБД, но команда выглядит не корректной.
Re:ADDataMove - еще не дописаны?
Posted: 2008/01/15 15:45
 
Жаль что нельзя использовать SELECT таким образом

Использую MySQL. Ничего предосудительного в команде сервер не видит, и коректно ее исполняет

INSERT INTO rawstartdata (DeviceType, FactoryNum, VehicleID, DateTimeUTC, StartType, iButton, DriverID) SELECT '1', '2', '3', '2007-12-29 13:50:26', '4', '6', (SELECT DriverID FROM iButtons WHERE iButtonID = '2');

Имеется ли где либо пример обратной процедуры (к сожалению найти не удалось). Быстрое преобразование результатов селекта в массив.

Заранее огромное спасибо
Александр

Разобрался... после выполнения SQL запроса
for i := 0 to RecordCount - 1 do begin
RecNo := i + 1;
arrIBut[i].IButton := FieldByName('iButtonID').AsString;
arrIBut[i].DriverID := FieldByName('DriverID').AsInteger;
end;

Post edited by: ReniLV, at: 2008/01/15 16:20
Re:ADDataMove - еще не дописаны?
Posted: 2008/01/15 23:36
 
Извините, не сообразил сразу. Что бы Array DML работал в MySQL, команда должна быть INSERT INTO ... VALUES .... Без Values работать не будет.