| 
    
            
         
         | 
    
  | 
Параметризованные запросы 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 
 | 
         
        из тех журнала.     
         | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |