Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Много INSERT'ов в ZQuery 
V
    Опции темы
JackyFox
  Дата 18.10.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



Здравствуйте!

Делаю БД на MySQL, клиентская часть на C++ Builder 2006 + Zeoslib 6.6.6.

Возникла проблема при попытке выполнить запрос, содержащий несколько операторов INSERT. По одиночке выполняются без проблем, а вот если их два или больше, то вы появляется ошибка 1064 "У вас ошибка в синтаксисе. Читайте мануал".

Работаю по принципу:

Код

AnsiString query;
ZQuery1->SQL->Clear();
while (someCondition)
{
    query = "INSERT INTO `Testing` VALUES (NULL, '" + 
        Date + "', '" + 
        usefulValue01 + "', '" +
        // и так несколько раз
        "');";
    ZQuery1->SQL->Add(query);
}
ZQuery1->ExecSQL();


В итоге ZQuery1->SQL содержит нечто подобное:
Код

INSERT INTO `Testing` VALUES (NULL, '2010-10-18 10:44:27', '25', '73', '12.1', '2.5', '12.2', '51.4', '2.7', '51', '93.1', '3.2', '93.4', '3');
INSERT INTO `Testing` VALUES (NULL, '2010-10-18 10:44:27', '25', '73', '12.1', '2.5', '12.2', '51.4', '2.7', '51', '93.1', '3.2', '93.4', '4');
INSERT INTO `Testing` VALUES (NULL, '2010-10-18 10:44:27', '25', '73', '12.1', '2.5', '12.2', '51.4', '2.7', '51', '93.1', '3.2', '93.4', '5');


Пробовал обрамлять запрос в 
Код

SET AUTOCOMMIT=0;
-- ---
COMMIT;


Проводил вышеуказанные запросы, которые собственно взяты из логов работы компонента ZQuery, вручную через MySQL Workbench. Всё прекрасно выполняется.

Думаю вот не делать ли ExecSQL() для каждого инсерта по отдельности. По сути у меня этих вставок более шести быть не должно за раз, но всё же чувствую какой-то дискомфорт от такого решения.

Посоветуйте более элегантный вариант, или же укажите на ошибки. Спасибо
--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
mrbrooks
Дата 18.10.2010, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



По хорошему такой подход не кошерен априори. 
Если уж и вставлять много данных, то я бы использовал builk insert, то бишь аля:

Код

insert into tablefuck (fuckid, fuckval) values(1,1),(1,2),(1,3),…(1,n);


возможно (возможно!) поможет. однако не стоит забывать - мускул кеширует данные. кажись по умолчанию - 8 Мб. Это стоит учитывать, дабы не получить удар в интересное место. Разумеется кэшем можно управлять.

Так же есть смысл использовать хранимые процедуры.
PM MAIL   Вверх
JackyFox
Дата 18.10.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



mrbrooks, попробую булки. Спасибо за совет.

Я сильно ламер по части БД. Расскажи, как грамотно производить транзакцию в случае необходимости заполнения сразу нескольких строк в таблице.

Смотрел, что делает воркбенч при формировании запросов с несколькими инсертами: автокомит — ноль, потом инсерты, в конце комит. Но в бильдере такой подход вызывает ошибку. Видимо, ZQuery где-то надо подкрутить.
--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
mrbrooks
Дата 18.10.2010, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(JackyFox @  18.10.2010,  13:37 Найти цитируемый пост)
Расскажи, как грамотно производить транзакцию в случае необходимости заполнения сразу нескольких строк в таблице.
Смотрел, что делает воркбенч при формировании запросов с несколькими инсертами: автокомит — ноль, потом инсерты, в конце комит.


да я обычно делал чет вроде этого:
Код

START TRANSACTION;
INSERT; 
...
INSERT;
COMMIT;


рекомендую в этом плане ориентироваться на документацию мускула.

Цитата(JackyFox @  18.10.2010,  13:37 Найти цитируемый пост)
Но в бильдере такой подход вызывает ошибку. Видимо, ZQuery где-то надо подкрутить.

я думаю это связано с Zeos.

В принципе транзакциями можно управлять и кодом. У TZConnection должны быть соответствующие методы.

Добавлено через 9 минут и 51 секунду
так оно и есть:
старт:
TZConnection::StartTransaction()
подтверждение:
TZConnection::Commit()   
отмена: 
TZConnection::Rollback()

и еще всякая разная бодяга. 
PM MAIL   Вверх
JackyFox
Дата 18.10.2010, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



mrbrooks, не выходит со стартом и коммитом. Некогда сейчас разбираться, оставил пока вариант:

Код

while (someCondition)
{
    ZQuery1->SQL->Clear();
    ZQuery1->SQL->Add("INSERT INTO somesheet VALUES (id, val);");
    ZQuery1->ExecSQL();
}


То бишь, каждый инсерт отправляется серверу по отдельности. Криво, зато работает. Будет время — поковыряю еще.

Еще раз благодарствую за помощь.
--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
mrbrooks
Дата 18.10.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(JackyFox @  18.10.2010,  15:21 Найти цитируемый пост)
не выходит со стартом и коммитом. :

есть мнение, что zeos - не православный. и да же программно не выходит?

Цитата(JackyFox @  18.10.2010,  15:21 Найти цитируемый пост)
Некогда сейчас разбираться, оставил пока вариант:

а builk insert? 

Цитата(JackyFox @  18.10.2010,  15:21 Найти цитируемый пост)
То бишь, каждый инсерт отправляется серверу по отдельности. Криво, зато работает.

ужоз.
PM MAIL   Вверх
JackyFox
Дата 18.10.2010, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 21.11.2007

Репутация: нет
Всего: 7



mrbrooks, я криворукий smile 

Builk insert работает. Буду пользовать его.
--------------------
У вас менее 250 сообщений, ссылки отключены
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.