Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

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

ADODB как передать в параметре массив строк
Я
   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(Параметр);

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует