ADODB как передать в параметре массив строк #782753


#0 by organizm
Задача сделать запрос типа: SELECT * FROM T WHERE code IN (?) в параметре должен быть массив. ВЫчитал, что для этого надо использовать COMSafeArray вот здесь о нем: . Делаю так: Не понятно остается, что вставить в "Тип" ?
#1 by organizm
ТипДанныхМассива = "VT_BSTR";
#2 by organizm
...
#3 by organizm
"мас" создается. Проверено в отладчике. А вот дальше ругается на не соответствие типов в CreateParameter...
#4 by Fragster
помню, для PDO писал специальную раскукоживалку текста запроса
#5 by aka AMIGO
А можно передавать массив по-элементно?
#6 by organizm
это извращение.
#7 by Fragster
которая вместо ? подставляла сначала нужное количество ?, ?, ?... (вернее у меня были именованные параметры и подставлялось имя_индекс), а потом эти параметры подставлялись из массива
#8 by organizm
но можно конечно.
#9 by Fragster
по другому не получится. если профайлером посмотреть, например, 1с так тоже делает
#10 by organizm
если очень много параметров в тексте, то ругается на слишком длинный текст запроса.
#11 by organizm
вот я и хочу понять, почему не получается
#12 by organizm
вроде здесь: написано что надо AdArray = 0x2000 . Но я не пойму как это значение написать в 1С ?
#13 by NorthWind
а что за СУБД? Вы уверены, что она может принимать такой параметр?
#14 by organizm
Oracle. Почему нет, это же делается через драйвер ADODB объект COMSafeArray все разработчики стараются прописывать. Состав COMSafeArray - строковые значения, примитивы.
#15 by NorthWind
когда у меня возникали подобные задачи, например, с Access, я делал через вспомогательную таблицу, которую заполнял значениями и передавал ее в запрос примерно таким образом: SELECT * FROM T WHERE code IN (select CODE from TEMP_TABLE where HANDLE=:HANDLE) и передавал единственный параметр - управляющее значение, которое определялось при заполнении таблицы значениями. . Да, в Oracle, если правильно помню, начиная с версии 7.2 можно так делать.
#16 by organizm
да беда с временными таблицами в Оракле
#17 by organizm
не умею я их там делать....
#18 by NorthWind
сделайте постоянную, делов-то
#19 by NorthWind
что касается передачи DML array, то я точно помню, что через OCI это работало. в руководстве по DOA (Direct Oracle Access) даже главка была где был пример написан. Но вот как это реализовано в ADO и насколько совместимо с ораклом - вопрос сложный
#20 by NorthWind
в оракле это правда можно. Но насколько я понял, это специфическая "штука" оракла. Для нее даже есть спецтермин - DML array.
#21 by organizm
придется метод проб и ошибок подключать...
#22 by NorthWind
Возможно. Проблема в том, что данный вопрос - он не по 1С, а по клиентской части Oracle и работе OLEDB провайдера для Oracle. Здесь вряд ли тусуются серьезные оракловоды, которые смогли бы помочь. Я бы в первую очередь постарался понять, поддерживает ли ваш OLEDB провайдер для Oracle DML array. Если нет, то остальные телодвижения просто не имеют смысла и нужно действовать как предложено в . Если да, то можно поэкспериментировать/поискать примеры.
#23 by NorthWind
а что непонятного? 0x2000 = 8192. Вот это значение и указываете.
#24 by Fragster
там написано, что это      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 by NorthWind
ADO и ADOX разные вещи... вообще говоря, ADO в простых запросах обычно умеет автоматически генерировать параметры правильного типа. Но тут многое зависит от провайдера. У меня, к сожалению, нет сейчас оракла под руками, поэтому я не могу посмотреть что за параметр получится для такого запроса.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С