Zeoslib, ExecSQL

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

Zeoslib, ExecSQL

Сообщение Zhbr » 03.04.2016 22:34:56

Доброго времени суток.
Ситуация следующая добавляю строки в 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
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение Little_Roo » 03.04.2016 22:42:10

ZQuery2.ExecSQL; \0
? и это что? :shock:
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Zeoslib, ExecSQL�

Сообщение vitaly_l » 03.04.2016 22:42:54

Покажите как Вы несколько строк отправляете?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Zeoslib, ExecSQL�

Сообщение Zhbr » 03.04.2016 23:25:15

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


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

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

В цикле через ZQuery.sql.add(), затем после цикла execsql.
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение sign » 04.04.2016 03:46:56

Конкретно кусок текста программы, а не слова о программе.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Zeoslib, ExecSQL�

Сообщение Zhbr » 04.04.2016 09:28:00

Добавляю вот так:
Код: Выделить всё
  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;
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение kav » 04.04.2016 12:39:28

метод ZQuery2.ExecSQL выполняет ОДИН SQL запрос а не несколько сразу.
Если бы он назывался ZQuery2.ExecSQLScript или как-то похоже тогда - да
можно было бы и несколько запросов сразу.
kav
незнакомец
 
Сообщения: 3
Зарегистрирован: 04.08.2015 21:38:28

Re: Zeoslib, ExecSQL

Сообщение Zhbr » 04.04.2016 13:00:39

Да, Вы правы. Как жаль что по zeos доков не осталось. А может кто знает в zeos нет ли встроенного метода выполнения всех запросов из TSringList или нужно свой метод написать?
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение vitaly_l » 04.04.2016 13:11:34

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 запросам - там всё есть.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Zeoslib, ExecSQL�

Сообщение Zhbr » 04.04.2016 13:26:41

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

Re: Zeoslib, ExecSQL�

Сообщение svk12 » 04.04.2016 17:07:26

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


Компонент TZSQLProcessor.
svk12
постоялец
 
Сообщения: 407
Зарегистрирован: 09.06.2008 18:42:47

Re: Zeoslib, ExecSQL�

Сообщение Zhbr » 04.04.2016 17:58:07

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;

Кстати так тоже нельзя, ошибка аналогичная.
Zhbr
новенький
 
Сообщения: 44
Зарегистрирован: 31.01.2014 02:34:21

Re: Zeoslib, ExecSQL�

Сообщение Ism » 04.04.2016 18:04:06

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

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

http://zeoslib.sourceforge.net/
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Zeoslib, ExecSQL�

Сообщение vitaly_l » 04.04.2016 18:57:53

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

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

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Zeoslib, ExecSQL�

Сообщение sign » 05.04.2016 07:03:40

Я работаю на компонентах лазаруса (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 убирает последнюю запятую
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

След.

Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru