Вы можете создать большую вставку, что-то вроде:
Qry := TAdsQuery.Create(nil);
Qry.AdsConnection := Conn;
String qry = "INSERT INTO SOMETABLE (COL1, COL2, COL3)";
String values = "";
while not OtherTable.Eof do
begin
values += "('" + OtherTable.FieldByName('COL1').AsString +
"','" + OtherTable.FieldByName('COL1').AsString +
"','" + OtherTable.FieldByName('COL1').AsString +
"'),";
OtherTable.Next;
end;
//to remove last ',' and add query terminator ";"
values = values.SubString(0, values.Length()-1) + ";";
qry = qry + values; //build the bulk insert
Qry.Add(qry);
Qry.ExecSQL;
//Qry.Close() no need of this, exec executes the command and leave, theres nothing to close
// Free query
Conn.Close;
оператор вставки должен выглядеть следующим образом:
INSERT INTO (col1, col2, col3) значения
( 'Val1', 'значение2', 'val3'),
( 'Val1', 'значение2', 'val3'),
( 'Val1', 'значение2', 'val3'),
...,
( 'Знач1', 'знач2', 'val3');
При этом, как предлагает Кен, вы используете только одно соединение, но ваше приложение работает быстрее, поскольку вы вставляете больше данных в один запрос.
минусы: - данные не должны содержать ошибок, так как определить, какой набор данных вызывает проблемы, сложнее, поскольку вы вставляете сотни наборов одновременно.
-Компонент не работает нормально с большими запросами, поэтому лучше разбивать данные на куски и обрабатывать вставки, например, по 500 строк за раз.
В настоящее время я использую этот подход со вставками по 1000 строк (с 4-8 столбцами данных) без проблем, я тестирую его с 5000 строками, но выбрасываю исключение «потерянное соединение во время запроса», поэтому я оставил его в 1000. Я думаю, что при настройке сервера вы могли бы увеличить скорость передачи данных, предполагая, что компонент не является проблемой, в моем случае 1000 достаточно.
Наконец, я использую Builder C ++, а не Delphi, поэтому код, который я публикую, может содержать ошибки
-Jose