Zeoslib, ExecSQL

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

Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Zeoslib, ExecSQL

Сообщение Zhbr »

Доброго времени суток.
Ситуация следующая добавляю строки в ZQuery:

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

ZQuery2.SQL.Add(format('INSERT INTO oc_category_to_store (category_id, store_id) VALUES (''%d'', ''0'');',[temp^.category_id]));\0


Добавив все необходмиые запросы выполняю:

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

 ZQuery2.ExecSQL; \0

Выскакивает исключение - errcode: 1064, error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('900001126', '0' at line 2

Никак не пойму, если для каждой строки отдельно выполнять ExecSQL все окей, сформированный TStringList без проблем через консоль выполняется корректно. Конечно можно и каждую строку отдельно выполнять, но хотелось бы понять почему несколько строк сразу не могу импортировать.
Lazarus 1.6, на локальной машине mariadb10.1 на удаленной mysql 5.5
Аватара пользователя
Little_Roo
энтузиаст
Сообщения: 639
Зарегистрирован: 27.02.2009 18:56:36
Откуда: Санкт-Петербург

Re: Zeoslib, ExecSQL�

Сообщение Little_Roo »

ZQuery2.ExecSQL; \0
? и это что? :shock:
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: Zeoslib, ExecSQL�

Сообщение vitaly_l »

Покажите как Вы несколько строк отправляете?
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение Zhbr »

Little_Roo писал(а):ZQuery2.ExecSQL; \0
? и это что? :shock:


Это я из редактора Лазаруса вставлял. Незнаю почему он добавил. В исходниках этого нет

Добавлено спустя 2 минуты 2 секунды:
vitaly_l писал(а):Покажите как Вы несколько строк отправляете?

В цикле через ZQuery.sql.add(), затем после цикла execsql.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Zeoslib, ExecSQL�

Сообщение sign »

Конкретно кусок текста программы, а не слова о программе.
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение Zhbr »

Добавляю вот так:

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

  temp:=FCategory;
  while temp^.Next <> nil do
      begin
       s:=False;
       ZQuery1.First;
       while not ZQuery1.EOF do
          begin
           if ZQuery1.FieldByName('category_id').AsInteger = temp^.category_id then s:=True;
           ZQuery1.Next;
          end;
      if not s then ZQuery2.SQL.Add(format('INSERT INTO oc_category_to_store (category_id, store_id) VALUES (''%d'', ''0'');',[temp^.category_id]));
       temp:= temp^.Next;
      end;
   ZQuery2.ExecSQL;
   ZQuery2.SQL.Clear;
kav
незнакомец
Сообщения: 3
Зарегистрирован: 04.08.2015 20:38:28

Re: Zeoslib, ExecSQL�

Сообщение kav »

метод ZQuery2.ExecSQL выполняет ОДИН SQL запрос а не несколько сразу.
Если бы он назывался ZQuery2.ExecSQLScript или как-то похоже тогда - да
можно было бы и несколько запросов сразу.
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL

Сообщение Zhbr »

Да, Вы правы. Как жаль что по zeos доков не осталось. А может кто знает в zeos нет ли встроенного метода выполнения всех запросов из TSringList или нужно свой метод написать?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: Zeoslib, ExecSQL�

Сообщение vitaly_l »

Zhbr писал(а):А может кто знает в zeos нет ли встроенного метода выполнения всех запросов из TSringList или нужно свой метод написать?

Вообще Вы изначально неправильно делаете.

Вам нужно сделать ОДИН ExecSQL запрос, а вот отправлять в нём, вставку всех 1000 значений. Что-то типа такого:

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

ZQuery2.SQL.Add( 'INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('111', ''0''),('222', ''0''),('333', ''0''),('444', ''0''),('555', ''0'');' );
ZQuery2.ExecSQL;


либо можно в одном запросе делать вот так:

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


SQLstring := '
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('111', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('222', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('333', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('444', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('555', ''0'');
';

ZQuery2.SQL.Add( SQLstring );
ZQuery2.ExecSQL;



Принцип примерно понятен думаю, но лучше почитайте доку по SQL запросам - там всё есть.



.
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение Zhbr »

Понял, благодарю.
svk12
постоялец
Сообщения: 411
Зарегистрирован: 09.06.2008 18:42:47

Re: Zeoslib, ExecSQL�

Сообщение svk12 »

Zhbr писал(а):А может кто знает в zeos нет ли встроенного метода выполнения всех запросов из TSringList или нужно свой метод написать?


Компонент TZSQLProcessor.
Zhbr
новенький
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение Zhbr »

svk12 писал(а):
Zhbr писал(а):А может кто знает в zeos нет ли встроенного метода выполнения всех запросов из TSringList или нужно свой метод написать?


Компонент TZSQLProcessor.

Спасибо добрый человек , это то что необходимо.
Если не трудно ниукого документации по zeos'у нет? Офф сайт давно у них уже в ауте.



vitaly_l писал(а):либо можно в одном запросе делать вот так:
КОД: ВЫДЕЛИТЬ ВСЁ

SQLstring := '
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('111', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('222', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('333', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('444', ''0'');
INSERT INTO oc_category_to_store (category_id, store_id) VALUES ('555', ''0'');
';

ZQuery2.SQL.Add( SQLstring );
ZQuery2.ExecSQL;

Кстати так тоже нельзя, ошибка аналогичная.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Zeoslib, ExecSQL�

Сообщение Ism »

Если нужно много insert values используйте Connection.ExecuteDirect

Zhbr писал(а):Если не трудно ниукого документации по zeos'у нет? Офф сайт давно у них уже в ауте.

http://zeoslib.sourceforge.net/
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Re: Zeoslib, ExecSQL�

Сообщение vitaly_l »

Zhbr писал(а):Кстати так тоже нельзя, ошибка аналогичная.

Странно, что не работает, но верю (я по аналогии советовал).
А первый вариант работает ?

.
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Zeoslib, ExecSQL�

Сообщение sign »

Я работаю на компонентах лазаруса (MySQL).
Делаю вот так:

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

    
var qTmp1: TSQLQuery;
...
    qTmp1.SQL.BeginUpdate;
    qTmp1.SQL.Text := 'INSERT INTO ' + CListBase[Param.Base] + '(Un, DateOp, Nakl, UNP, Firm, Article, CountBuy, Promo, Oper, Retail) VALUES ';
    P := V.RootNode^.FirstChild;
    while Assigned(P) do begin
      Data := V.GetNodeData(P);
...
      qTmp1.SQL.Add(Format('(%s, "%s", %s, %s, %d, %s, %d, %d, %d, %d),',
          [sUn, SD, SN, Data^.UNPStr, Data^.FirmInt, Data^.ArticleStr, Data^.CountBuy, Ord(Data^.Is_Promo), 0, Data^.Retail]));
      P := V.GetNextNoInit(P);
    end;
    MakeEndInsert(qTmp1.SQL);
    qTmp1.SQL.EndUpdate;
    qTmp1.ExecSQL;


Процедура MakeEndInsert убирает последнюю запятую
Ответить