Имя: Пароль:
1C
1С v8
ADODB как передать в параметре массив строк
,
0 organizm
 
13.10.16
08:38
Задача сделать запрос типа: SELECT * FROM T WHERE code IN (?) в параметре должен быть массив. ВЫчитал, что для этого надо использовать COMSafeArray вот здесь о нем: https://its.1c.ru/db/metod8dev#content:2262:hdoc@55293b25 . Делаю так:
мас      = Новый COMSafeArray(Значение, ТипДанныхМассива, Значение.Количество());
    Параметр = Команда.CreateParameter("", Тип, 1, Значение.Количество(), мас);
    Команда.Parameters.Append(Параметр);

Не понятно остается, что вставить в "Тип" ?
1 organizm
 
13.10.16
08:39
ТипДанныхМассива = "VT_BSTR";
2 organizm
 
13.10.16
08:39
Значение = Новый Массив();
Значение.Добавить("12341");
...
3 organizm
 
13.10.16
08:42
"мас" создается. Проверено в отладчике. А вот дальше ругается на не соответствие типов в CreateParameter...
4 Fragster
 
гуру
13.10.16
08:45
помню, для PDO писал специальную раскукоживалку текста запроса
5 aka AMIGO
 
13.10.16
08:46
А можно передавать массив по-элементно?
6 organizm
 
13.10.16
08:47
(5) это извращение.
7 Fragster
 
гуру
13.10.16
08:47
которая вместо ? подставляла сначала нужное количество ?, ?, ?... (вернее у меня были именованные параметры и подставлялось имя_индекс), а потом эти параметры подставлялись из массива
8 organizm
 
13.10.16
08:47
но можно конечно.
9 Fragster
 
гуру
13.10.16
08:47
(6) по другому не получится. если профайлером посмотреть, например, 1с так тоже делает
10 organizm
 
13.10.16
08:48
если очень много параметров в тексте, то ругается на слишком длинный текст запроса.
11 organizm
 
13.10.16
08:49
(9) вот я и хочу понять, почему не получается
12 organizm
 
13.10.16
08:51
вроде здесь: https://msdn.microsoft.com/ru-ru/library/ms675318(v=vs.85).aspx
написано что надо AdArray = 0x2000 . Но я не пойму как это значение написать в 1С ?
13 NorthWind
 
13.10.16
08:57
(0) а что за СУБД? Вы уверены, что она может принимать такой параметр?
14 organizm
 
13.10.16
09:00
Oracle.
Почему нет, это же делается через драйвер ADODB объект COMSafeArray все разработчики стараются прописывать. Состав COMSafeArray - строковые значения, примитивы.
15 NorthWind
 
13.10.16
09:01
когда у меня возникали подобные задачи, например, с Access, я делал через вспомогательную таблицу, которую заполнял значениями и передавал ее в запрос примерно таким образом:
SELECT * FROM T WHERE code IN (select CODE from TEMP_TABLE where HANDLE=:HANDLE)
и передавал единственный параметр - управляющее значение, которое определялось при заполнении таблицы значениями.
.
Да, в Oracle, если правильно помню, начиная с версии 7.2 можно так делать.
16 organizm
 
13.10.16
09:03
да беда с временными таблицами в Оракле
17 organizm
 
13.10.16
09:04
не умею я их там делать....
18 NorthWind
 
13.10.16
09:05
сделайте постоянную, делов-то
19 NorthWind
 
13.10.16
09:08
что касается передачи DML array, то я точно помню, что через OCI это работало. в руководстве по DOA (Direct Oracle Access) даже главка была где был пример написан. Но вот как это реализовано в ADO и насколько совместимо с ораклом - вопрос сложный
20 NorthWind
 
13.10.16
09:12
(9) в оракле это правда можно. Но насколько я понял, это специфическая "штука" оракла. Для нее даже есть спецтермин - DML array.
21 organizm
 
13.10.16
10:34
придется метод проб и ошибок подключать...
22 NorthWind
 
13.10.16
15:11
(21) Возможно. Проблема в том, что данный вопрос - он не по 1С, а по клиентской части Oracle и работе OLEDB провайдера для Oracle. Здесь вряд ли тусуются серьезные оракловоды, которые смогли бы помочь. Я бы в первую очередь постарался понять, поддерживает ли ваш OLEDB провайдер для Oracle DML array. Если нет, то остальные телодвижения просто не имеют смысла и нужно действовать как предложено в (15). Если да, то можно поэкспериментировать/поискать примеры.
23 NorthWind
 
13.10.16
15:15
(12) а что непонятного? 0x2000 = 8192. Вот это значение и указываете.
24 Fragster
 
гуру
13.10.16
15:17
(23) там написано, что это     

A flag value, always combined with another data type constant, that indicates an array of the other data type. Does not apply to ADOX.

во первых - надо просуммировать с типом содержимого массива, а во вторых - не применимо к ADO
25 NorthWind
 
13.10.16
15:27
(24) ADO и ADOX разные вещи... вообще говоря, ADO в простых запросах обычно умеет автоматически генерировать параметры правильного типа. Но тут многое зависит от провайдера. У меня, к сожалению, нет сейчас оракла под руками, поэтому я не могу посмотреть что за параметр получится для такого запроса.
Закон Брукера: Даже маленькая практика стоит большой теории.