Как отправить в sql несколько запрос в одном пакете?

1. GennadiyN 12.06.20 09:15 Сейчас в теме
Всем Добрый день!

Вообщем есть код который отправляет запросы в 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
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 12.06.20 09:50 Сейчас в теме
(1)1. Почему вы решили, что так вообще можно делать?
2. Запихивать значения полей в текст запроса - моветон.
4. GennadiyN 12.06.20 10:09 Сейчас в теме
(2) А так нельзя? подскажите как правильно)
5. nomad_irk 72 12.06.20 10:26 Сейчас в теме
(4)
Именно через Command - нельзя, либо циклически выполняйте по одному запросу.
Можно через изменение RecordSet, методом UpdateBatch
10. GennadiyN 12.06.20 14:07 Сейчас в теме
(5)

Я с sql на "Вы", можете направление подробное дать, как работать с методом UpdateBatch)

Пытался найти что то по UpdateBatch, пока что то толкого не нашел. UpdateBatch также работает как Command?
6. Xershi 1484 12.06.20 12:27 Сейчас в теме
(1) а какой смысл делать 2 пакета?
Отправь в 1 запросе все или 2 запроса.
У вас разная логика, такую команду нужно 2 запросами делать.
Хотя вон пишут есть другая команда, но это уже учите sql. В таком виде в 1 запросе не работает.
9. GennadiyN 12.06.20 14:05 Сейчас в теме
(6)
Два запроса не производительно, просто потом будет 10 тыс. отправлять)

а как в одном запросе можно это отправить?
13. Xershi 1484 12.06.20 14:16 Сейчас в теме
(9) либо учитесь, либо делайте как правильно (умете). Я не специалист по sql.
7. independ 1520 12.06.20 12:48 Сейчас в теме
(1) может между запросами вставить GO?
11. GennadiyN 12.06.20 14:08 Сейчас в теме
14. independ 1520 16.06.20 18:49 Сейчас в теме
15. GennadiyN 18.06.20 15:11 Сейчас в теме
(14) Спасибо! Через Вашу ссылку нашел документацию http://www.script-coding.com/ADO.html, которая разъяснила ситуацию)
3. МихаилМ 12.06.20 10:06 Сейчас в теме
8. GennadiyN 12.06.20 14:03 Сейчас в теме
(3) (4)

Я с sql на "Вы", можете направление подробное дать, как работать с методом UpdateBatch)

Пытался найти что то по UpdateBatch, пока что то толкого не нашел. UpdateBatch также работает как Command?
16. GennadiyN 18.06.20 15:24 Сейчас в теме
Вообщем может кому пригодится:


&НаСервере
Процедура ЗагрузитьНаСайтТоварыНаСервере()
//Здесь подключение к 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);
	КонецПопытки;
	
КонецПроцедуры


Показать
nomad_irk; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот