Topic: ADDataMove - еще не дописаны?
|
|
xaxulin
User
 Fresh Boarder
| Posts: 2 |   | Karma: 0 |
|
ADDataMove - еще не дописаны?
|
|
Posted: 2007/03/13 11:26 |
|
|
|
|
ADDataMove - еще не дописаны? Пытаюсь переслатьданные из одной таблицы в другую... Exception на {-------------------------------------------------------------------------------} procedure TADAdaptedDataSet.ServerSetKey; begin { TODO -cCLNT : To implement ServerSetKey } raise Exception.Create('Not implemented'); end; {-------------------------------------------------------------------------------} когда ожидается полная реализация?
|
|
Diman
Admin
 Admin
| Posts: 1461 |  | Karma: 18 |
|
Re:ADDataMove - еще не дописаны?
|
|
Posted: 2007/03/14 04:16 |
|
|
|
|
Привет
Да, не все режимы ADDataMove поддерживаются. 1) Либо включите poClearDest или poClearDestNoUndo в опции. Но тогда приемник будет очищаться перед загрузкой. 2) Либо установите Mode в dmAlwaysInsert. Тогда записи будут добавлены к уже имеющимся в приемнике. 3) Либо напишите обработчик события OnFindDestRecord, который будет определять имеется ли исходная запись в приемнике.
Удачи, Дмитрий
|
|
Erik
User
 Junior Boarder
| Posts: 16 |   | Karma: 0 |
|
Re:ADDataMove - еще не дописаны?
|
|
Posted: 2007/03/14 06:14 |
|
|
|
|
|
Мне кажется лучше вопрос задать в это теме. ADDataMove будет ли подерживать специфические механизмы Oracle(OraLoader)? Это быстрая загрузка внешних данных из памяти. В стандартной поставке есть такая утилита он она загружает из текстового файла. В ODAC тоже есть OraLoader, немного странно написан но работает. Грузит данные из любого источника простым присвоением занчений колонкам и через каждые 100 записей скидывает их в таблицу.
|
|
Diman
Admin
 Admin
| Posts: 1461 |  | Karma: 18 |
|
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 i := 0 to Params.ArraySize - 1 do begin
Params[0].AsIntegers[i] := i;
.........
Params[n].AsStrings[i] := 'qweqweqwe';
end;
Execute(Params.ArraySize);
end;
|
Данный способ обеспечивает очень высокую скорость вставки записей - раз в 50 быстрее в моем окружении.
Удачи,
Дмитрий
|
|
Erik
User
 Junior Boarder
| Posts: 16 |   | Karma: 0 |
|
Re:ADDataMove - еще не дописаны?
|
|
Posted: 2007/03/14 10:11 |
|
|
|
|
Неужели этот способ быстрее вставки через StoredProc? Чтото сомненаюсь, мне за раз надо вставить примерно 50000 строк их 15 колоник, все поля numeric. OraLoader вставляет за 21-145 секунды, учитывая построение индекса. Вставка происходит каждые 15 минут и должна идти за минимальное время, раньше использовал SP, пришлось переписать на OraLoader. Я не из праздного интереса спрашиваю, у меня достаточно много разных задач, которые сейчас крутятся на ODAC или BDE. Вот узнаю возможности продукта.
|
|
Diman
Admin
 Admin
| Posts: 1461 |  | Karma: 18 |
|
Re:ADDataMove - еще не дописаны?
|
|
Posted: 2007/03/14 10:18 |
|
|
|
|
Мне сложно оперировать конкретными цифрами. Просто попробуйте Вставляйте массивами по 10,000 элементов.
|
|
ReniLV
User
 Fresh Boarder
| Posts: 5 |   | Karma: 0 |
|
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)');
С уважением Александр
|
|
Diman
Admin
 Admin
| Posts: 1461 |  | Karma: 18 |
|
Re:ADDataMove - еще не дописаны?
|
|
Posted: 2008/01/15 01:11 |
|
|
|
|
Можно использовать любую параметризованную не-SELECT SQL команду. Основное требование - команда должна иметь корректный синтаксис. Не знаю какая у вас СУБД, но команда выглядит не корректной.
|
|
ReniLV
User
 Fresh Boarder
| Posts: 5 |   | Karma: 0 |
|
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
|
|
Diman
Admin
 Admin
| Posts: 1461 |  | Karma: 18 |
|
Re:ADDataMove - еще не дописаны?
|
|
Posted: 2008/01/15 23:36 |
|
|
|
|
|
Извините, не сообразил сразу. Что бы Array DML работал в MySQL, команда должна быть INSERT INTO ... VALUES .... Без Values работать не будет.
|
|
|