Имя: Пароль:
1C
1С v8
Параметризованные запросы ADODB и опции Execute
,
0 Fragster
 
гуру
02.07.14
16:41
Помогите победить:

Хочу сделать асинхронную вставку и параметризованный запрос. Проблема в том, что если указывать Команда.Execute(,,adExecuteNoRecords + adAsyncExecute), то оно говорит, что параметры не указаны. Видимо воспринимает второй аргумент как пустую коллекцию параметров.


Вот псевдокод:

    Команда = Новый ComОбъект("ADODB.Command");
    Команда.ActiveConnection = Соединение;
    
    Команда.CommandType = adCmdText;
    Команда.Prepared = Истина;
    
    Команда.CommandText = "INSERT INTO table (f1, f2) VALUES (?, ?)";
    
    Для Сч = 1 По 100 Цикл
        Команда.Parameters(0).Value = Сч;
        Команда.Parameters(1).Value = Сч;
        //Команда.Execute(,,adExecuteNoRecords + adAsyncExecute); // не работает
        Команда.Execute();
    КонецЦикла;


помогите, а то синхронная вставка сильно больше времени занимает :)
1 Fragster
 
гуру
02.07.14
17:19
что, все реально парятся с экранированием кавычек, вырезанием НПП и прочим геморроем при работе через ADODB?
2 shuhard
 
02.07.14
17:30
(0)[Хочу сделать асинхронную вставку]
по отношению с солнечно-лунной орбите или по отношению к эфимеридам ?
3 Fragster
 
гуру
02.07.14
17:42
(2) это все фигня. вот почему если сделать так:
        Команда.Execute(,NULL,мМагияСКЛ.adAsyncExecute + мМагияСКЛ.adExecuteNoRecords);


то вроде бы все правильно (и в коллекции параметров тоже), но вместо первого параметра (по совместительству первичному ключу) записывается NULL?
4 Fragster
 
гуру
02.07.14
17:43
(3)+ проверяю в коллекции параметров уже после EXECUTE
5 Fragster
 
гуру
02.07.14
17:45
вернее так: первым параметром уходит то, передано вторым параметров в Execute, но это как-то совсем неправильно :(
6 Jaap Vduul
 
02.07.14
18:01
А что мешает передать значения параметров массивом?
7 МихаилМ
 
02.07.14
18:02
почему не испльзуете  AddNew ?
в транзакции
8 Jaap Vduul
 
02.07.14
18:03
Или вместо необязательных параметров Неопределено попробовать передавать?
9 Fragster
 
гуру
02.07.14
18:04
(7) запрос немного сложнее :)
10 Fram
 
02.07.14
18:05
(0) bulk insert?
11 Fragster
 
гуру
02.07.14
18:15
(10) не угадал
12 MrStomak
 
02.07.14
18:42
Параметры = Новый Массив;
Параметры.Добавить(Команда.Parameters(0).Value);
Параметры.Добавить(Команда.Parameters(1).Value);
Команда.Execute(,Параметры,adExecuteNoRecords + adAsyncExecute);

Так не сработает?
13 Fragster
 
гуру
02.07.14
18:47
(12) не работает
14 Fram
 
02.07.14
18:48
(13) а так
Команда.Execute(,Команда.Parameters,adExecuteNoRecords + adAsyncExecute); ?
15 Fragster
 
гуру
02.07.14
18:56
(14) пихает NULL...

прокатило с ComSafeArray
16 Fragster
 
гуру
02.07.14
18:57
КомМассив = Новый COMSafeArray("VT_VARIANT", 2);
    Для Сч = 1 по 100 Цикл
        
        КомМассив.SetValue(0,Сч);
        КомМассив.SetValue(1,Сч);
        Команда.Execute(, КомМассив, adAsyncExecute + adExecuteNoRecords);

    КонецЦикла;
17 Fragster
 
гуру
02.07.14
19:00
(16) + заляпуха на ожидание, на случай, если то, что там еще в цикле делается таки быстрее скулевого запроса:

        Пока Команда.state = adStateExecuting Цикл // вообще тут надо по бинарной маске проверять, да
            Состояние("" + СчСтрок + " / " + КолСтрок + " ожидание заверщения асинхронной операции");
        КонецЦикла;
18 Fram
 
02.07.14
19:12
(17) а значения adAsyncExecute и тп просто числовые переменные?
19 Fragster
 
гуру
02.07.14
19:15
20 МихаилМ
 
02.07.14
22:33
я бы загрузил данные в ВТ
и обработал их скриптом либо хранимой процедурой.

мыслите множествами а не строками.
21 Fragster
 
гуру
11.07.14
17:06
кстати, вопрос: как получить реальный текст запроса? в СКД - знаю, в php + PDO - тоже. тут в мануалах что-то найти не могу...
22 МихаилМ
 
11.07.14
18:29
из тех журнала.