Вообщем есть код который отправляет запросы в sql, проблема в том что отправляет только по одному запросу, как только вставляю 2 запроса выпадает ошибка. Подскажите пожалуйста как можно оптимизировать и отправить пакет с несколькими запросами?
Текст = "UPD ATE `oc_category` SE T `parent_id` = '3' WHERE `oc_category`.`category_id` = 1;
|UPDATE `oc_category` SE T `parent_id` = '4' WHERE `oc_category`.`category_id` = 2;";
Результат.CommandText = Текст;
Результат.Execute();
Ошибка:
{ВнешняяОбработка.ВыгрузкаДанныхНаСайтOS.Форма.Форма.Форма(103)}: Ошибка при вызове метода контекста (Execute)
Результат.Execute();
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.30-log]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 'UPDATE `oc_category` SE T `parent_id` = '4' WHERE `oc_category`.`category_id` = 2' at line 2
(1) а какой смысл делать 2 пакета?
Отправь в 1 запросе все или 2 запроса.
У вас разная логика, такую команду нужно 2 запросами делать.
Хотя вон пишут есть другая команда, но это уже учите sql. В таком виде в 1 запросе не работает.
&НаСервере
Процедура ЗагрузитьНаСайтТоварыНаСервере()
//Здесь подключение к sql
Соединение = СоздатьПодключение();
Команд = Новый COMОбъект("ADODB.Command");
Команд.ActiveConnection = Соединение; // работаем через это соединение
Команд.CommandTimeOut = Соединение.CommandTimeOut; // таков тайм-аут
Команд.CommandType = "adCmdText";
//сначало делаем запрос в sql
//получаем данные из таблиц
ТаблицаКатегорий = ПолучитьТаблицуТоваровССайта(Команд);
//потом объединяем всю номенклатуру с полученной таблицей и определяем док колонкой какие данные будем добавлять, а какие обновлять
ТаблицаКатегорий = СоединитьТовары1С(ТаблицаКатегорий);
//собственно в этой процедуре разделяем данные которые будут обновляться а какие добавляться
ДобавлениеИОбновлениеНаСайтТовары(Соединение, ТаблицаКатегорий);
КонецПроцедуры
&НаСервере
Процедура ДобавлениеИОбновлениеНаСайтТовары(Соединение, ТЗ)
Command = Новый COMОбъект("ADODB.RecordSet");
Command.activeConnection = Соединение;
Command.CacheSize = 3000;
Command.Open("ps_product",Соединение,3,4,2);
//получаем таблицу для обновления sql
ОтборUPDATE = Новый Структура("ТипОперации", "UPDATE");
UPDATE = ТЗ.Скопировать(ОтборUPDATE);
//здесь удаляем лишние колонки
UPDATE = УдалитьКолонки(UPDATE);
//собственно процедура обновляет таблицу sql, передаем туда только те колонки которые нужно обновить и которые есть в sql, лишних колонок не должно быть
ПроцедураUPDATE(Command, UPDATE, "id_product");
//получаем таблицу для добавления в sql
ОтборINS ERT = Новый Структура("ТипОперации", "INS ERT");
INS ERT = ТЗ.Скопировать(ОтборINS ERT);
INS ERT.Колонки.Удалить("ТипОперации");
//собственно процедура добавляет дынные в таблицу sql, передаем туда только те колонки которые нужно обновить и которые есть в sql, лишних колонок не должно быть
ПроцедураINS ERT(Command, INS ERT);
КонецПроцедуры
//Процедура Обновления и Добавления данных
&НаСервере
Процедура ПроцедураUPDATE(Command, Таблица, ИмяПоиска)
СчетчикЛ = 0;
Счетчик = 0;
Пока не Command.EOF Цикл
Отбор = Новый Структура(ИмяПоиска, Command.Fields(ИмяПоиска).Value);
НайденыйЭлемент = Таблица.НайтиСтроки(Отбор);
Если НайденыйЭлемент.Количество()>0 Тогда
Для j=0 По Таблица.Колонки.Количество() -1 Цикл
Value = НайденыйЭлемент[0][j];
Если ЗначениеЗаполнено(Value) Тогда
//Сообщить(""+Таблица.Колонки[j].Имя+" ["+Value+"]");
Если (ТипЗнч(Value) = Тип("Число")) или (ТипЗнч(Value) = Тип("Дата")) тогда
Command.Fields(Таблица.Колонки[j].Имя).Value=Value;
Иначе
// Сообщить(Таблица.Колонки[j].Имя);
Попытка
Command.Fields(Таблица.Колонки[j].Имя).Value=Строка(Value);
Исключение
Сообщить(Таблица.Колонки[j].Имя+ " "+Строка(Value));
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Command.MoveNext();
Если СчетчикЛ = 3000 Тогда
СчетчикЛ = 0;
Command.UpdateBatch(); //4,false);
Счетчик = Счетчик + 1;
Иначе
СчетчикЛ = СчетчикЛ + 1;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПроцедураINS ERT(Command, Таблица)
СчетчикЛ = 0;
Для i=0 По Таблица.Количество() -1 Цикл
Command.AddNew();
Для j=0 По Таблица.Колонки.Количество() -1 Цикл
Value = ?(Таблица[i][j]= null, 0, Таблица[i][j]);
Если Val ue <> Неопределено Тогда
//Сообщить(""+Таблица.Колонки[j].Имя+" ["+Val ue+"]");
Если (ТипЗнч(Val ue) = Тип("Число")) или (ТипЗнч(Val ue) = Тип("Дата")) тогда
Command.Fields(Таблица.Колонки[j].Имя).Val ue=Value;
Иначе
// Сообщить(Таблица.Колонки[j].Имя);
Попытка
Command.Fields(Таблица.Колонки[j].Имя).Val ue=Строка(Val ue);
Исключение
Сообщить(Таблица.Колонки[j].Имя+ " "+Строка(Val ue));
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если СчетчикЛ = 3000 Тогда
СчетчикЛ = 0;
Command.UpdateBatch(); //4,false);
//Счетчик = Счетчик + 1;
Иначе
СчетчикЛ = СчетчикЛ + 1;
КонецЕсли;
//Command.update();
КонецЦикла;
Попытка
Command.UpdateBatch();
Command.Close();
Исключение
Сообщить(ОписаниеОшибки());
//Сообщить(NameTable);
КонецПопытки;
КонецПроцедуры