Lazarus 0.9.30.4 + SQLQuery запрос в несколько строк.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Lazarus 0.9.30.4 + SQLQuery запрос в несколько строк.

Сообщение wofs »

Доброго дня.
Собственно имеем Lazarus 0.9.30.4 и компонент SQLQuery. База sqlite, подключаемся через стандартные компоненты.
Этот код отказывается добавлять 11 строк в таблицу - добавляет только первую.

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

var
  i: integer;
......

 T1.Active := True;
    with QRun do
    begin
      Close;
      sql.Clear;

      for i := 0 to 10 do
      begin
        SQL.Add('INSERT INTO TableName (Field1,Field2) VALUES (1,' + IntToStr(i) + ');');
      end;

      ExecSQL;
    end;
    T1.Commit;         

Притом, этот отрабатывает все нормально.

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

  i: integer; 
......

with QRun do
    begin

      for i := 0 to 10 do
      begin
        T1.Active := True;
        Close;
        sql.Clear;
        SQL.Add('INSERT INTO TableName (Field1,Field2) VALUES (1,' + IntToStr(i) + ');');
        ExecSQL;
        T1.Commit;
      end;

    end;         

Но работает само собой жутко медленно... Ибо дергать коммит каждую строчку...
Собственно вопрос - как выполнить запрос в несколько строк?

p.s приведенные листинги несколько утрированы с целью показать суть.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

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

var
  i: integer;
......

T1.Active := True;
    with QRun do
    begin
      Close;
      sql.Clear;
      sql.Add('BEGIN TRANSACTION;')

      for i := 0 to 10 do
      begin
        SQL.Add('INSERT INTO TableName (Field1,Field2) VALUES (1,' + IntToStr(i) + ');');
      end;
      sql.Add('COMMIT TRANSACTION;')
      ExecSQL;
    end;
    T1.Commit;         

где-то так
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

Padre_Mortius писал(а):...где-то так...

TSQLQuery вообще на все попытки сделать COMMIT в самом запросе ругается:

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

Cannot start a transaction within in transaction.

и это не смотря на

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

BEGIN TRANSACTION;
в начале запроса...

Удалось добиться вменяемого управления транзакцией только с использованием TSQLTransaction (в моем примере T1).
А вот с запросом в несколько строк засада...
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Кто будет компоненты смотреть ?
TSQLScript
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

Ism писал(а):Кто будет компоненты смотреть ?
TSQLScript

Смотрел - он не позволяет загружать тексты запросов из файла и потока...
Согласитесь, несколько странно - TSQLQuery имеет возможность загружать тексты запросов из потока,что подразумевает работу с большими объемами, но не может выполнять более одной строчки...
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

wofs писал(а):Смотрел - он не позволяет загружать тексты запросов из файла и потока...

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

SQLScript1.Script.LoadFromFile(ScriptFileName);
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

iskander писал(а):

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

SQLScript1.Script.LoadFromFile(ScriptFileName);

Да,да - уже нашел :) Не досмотрел.
Всем спасибо!
Тему можно закрывать :)
Ответить