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