|
v7: OLEDBData. Параметризированный запрос. У кого есть пример? | ☑ | ||
---|---|---|---|---|
0
CaIIIka
22.03.23
✎
13:23
|
Здравствуйте! 1С 7.7. Кто может поделиться примером использования параметризированного запроса в OLEDBData? Можно самый простой. До истерики скоро доведет.
В ODBCRecordSet чего только не выделывал, но в данном случае SQL нет (база DBF). Переход на SQL не предлагать (по крайней мере сейчас) :) Есть текст: База = СоздатьОбъект("OLEDBData"); Соединение = "Provider=VFPOLEDB.1;Deleted=Yes;Data Source=" + КаталогИБ()+ "; TABLEVALIDATE=0;Mode=ReadWrite;Extended Properties=""; User ID="";Password="";Mask Password=False;Collating Sequence=MACHINE;DSN="""; Рез = База.Соединение(Соединение); Запрос = База.СоздатьКоманду(); Запрос.ДобПараметр(1,14,3,0); Запрос.ДобПараметр(1,14,40,0); Запрос.ДобПараметр(1,6,11,2); Запрос.ДобПараметр(1,6,11,2); ТЗ = " |declare @FIL char(3) |declare @CODE char(40) |declare @OST float |declare @REZ float |set @FIL = ? |set @CODE = ? |set @OST = ? |set @REZ = ? |insert into VO (FIL, CODE, OST, REZ) Values(@FIL,@CODE,@OST,@REZ)"; Запрос.Подготовить(ТЗ); Результат: Command contains unrecognized phrase/keyword Когда запрос был вида: "insert into VO (FIL, CODE, OST, REZ) Values(?,?,?,?)", то выдавала "Недопустимые флаги метода доступа". Че ей надо? В литературе сказано "Параметризированный запрос может иметь параметры (скалярные значения некоторых констант в запросе заменяют символами подстановки "?" (SQL параметры))". Есть описание методов добавления/установки параметров. Типы параметров описаны, но примера нет. На просторах тоже особо ничего не нашел. Кстати, в ODBCRecordSet тип параметра CHAR всегда был 14, в литературе по OLEDBData же сказано, что 14 - это DBTYPE_DECIMAL. Так ли это? Если не параметризированный запрос, то нормально срабатывает, но долго. 60тыс. строк каждый раз с некой периодичностью лопатить. |
|||
1
CaIIIka
22.03.23
✎
10:56
|
Да, типы параметров пробовал 129 и 131. Та же шляпа.
|
|||
3
vladmenleo
22.03.23
✎
12:41
|
(1) Если верить описанию в 1cpp.chm, то параметризированные запросы только для СКЛ!.
|
|||
4
CaIIIka
22.03.23
✎
13:09
|
(3) Вышеуказанная литература отсюда:
https://www.1cpp.ru/docum/icpp/html/oledb.html |
|||
5
CaIIIka
22.03.23
✎
13:32
|
Если сделать так:
ТЗ = "insert into VO (FIL, CODE, OST, REZ) Values(?,?,?,?)"; Запрос.Подготовить(ТЗ); то запрос выполняется, но в момент установки параметров пишет "Список параметров пуст!" Если так: ТЗ = "insert into VO (FIL, CODE, OST, REZ) Values(?,?,?,?)"; Запрос.Подготовить(ТЗ); Запрос.ДобПараметр(1,14,3,0); Запрос.ДобПараметр(1,14,40,0); Запрос.ДобПараметр(1,6,11,2); Запрос.ДобПараметр(1,6,11,2); пишет "Попытка добавить параметр, после того как был подготовлен набор параметров!" Замкнутый круг!!! Что ему в declare и set не нравится? Пробовал и через запятую одной строкой: declare @FIL char(3), @CODE char(40), OST float, @REZ float set @FIL = ?, @CODE = ?, OST = ?, @REZ = ? Все равно ругается "Command contains unrecognized phrase/keyword". |
|||
6
vladmenleo
22.03.23
✎
13:39
|
(5) Ну я как-бы тоже не придумал, за что купил, за то и продаю
https://pastenow.ru/55eb6e45a93fb9c94dbdb6cd5e7a2695 |
|||
7
CaIIIka
22.03.23
✎
13:47
|
(6) Согласен. Но непонятно, почему тогда работают методы Подготовить, ДобПараметр (до подготовления), УстановитьПараметр (ругается на пустой список параметров), КолвоПараметров (возвращает ноль, если без declare и set, только вопросы).
Это же все методы для параметризированных запросов. Схема вроде рабочая, только добавить параметры не получается по нормальному. |
|||
8
CaIIIka
22.03.23
✎
13:59
|
(6) Спасибо, благодаря Вашей картинке я нашел это в своей похожей инструкции. Там ниже про @Товар говорится.
Я продвинулся еще немного дальше, но все равно не работает :) declare и set больше не нужны. Теперь другая ошибка @FIL = ?, @CODE = ?, OST = ?, @REZ = ? insert into VO (FIL, CODE, OST, REZ) Values(@FIL,@CODE,OST,@REZ) Запрос.Подготовить(ТЗ); FAILED! ICommandPrepare::Prepare(0): Missing expression |
|||
9
CaIIIka
22.03.23
✎
14:59
|
В общем, начинал я с:
insert into VO (FIL, CODE, OST, REZ) Values(?,?,?,?)" И это было правильно. Но выдавала ошибку "Недопустимые флаги метода доступа" Потом я начал колхозить по полной. А на самом деле причина в другом. https://www.1cpp.ru/forum/YaBB.pl?num=1148038411/15 Положение исправляется добавлением в реестр ключа: В ветку [HKEY_CLASSES_ROOT\CLSID\{50BAEED9-ED25-11D2-B97B-000000000000}] добавить ключ "OLEDB_SERVICES"=dword:00000000 . Если этот ключ уже есть, то нужно значение установить в 0 (ноль). _____ ИТОГ: Добавление этого ключа, СОЗДАВ этот раздел, ни к чему не привело. В реестре еще огромная куча точно таких же параметров в разных разделах со значениями в основном "ffffffff". Доступа к ним нет. Лопатить права каждого нецелесообразно. Торговых точек несколько. Открывать доступ ко всей ветке - то же. При этом, устанавливать тупо всем этим параметрам нули, не понимая к чему это может привести - бред. Пол дня мучений - впустую. |
|||
10
uno-group
22.03.23
✎
16:14
|
Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ() + ";Exclusive=Yes;Mode=ReadWrite;Collating Sequence=MACHINE";
ДБ = СоздатьОбъект("OLEDBData"); Рез = ДБ.Соединение(Соединение); Запрос = ДБ.СоздатьКоманду(); Запрос.Выполнить("EXECSCRIPT('SET ANSI OFF')"); Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')"); Запрос.Выполнить("Exec('SET TABLEVALIDATE TO 0')");// Отключили блокировки Запрос = ДБ.СоздатьКоманду(); Имя = ИмяРегистра.ПолучитьЗначение(ИмяРегистра.ТекущаяСт рока()); стр =" |DELETE |FROM $РегистрИтоги."+Имя+" |WHERE "; т=""; Для к= 1 По Метаданные.Регистр(Имя).Ресурс() Цикл ИмяРесурса = Метаданные.Регистр(Имя).Ресурс(к); т=т+" |$РегистрИтоги."+Имя+"."+ИмяРесурса+" =0 and |"; КонецЦикла; т=т+"1=1"; стр=стр+т; Запрос.ВыполнитьИнструкцию(стр); КонецПроцедуры |
|||
11
uno-group
22.03.23
✎
16:15
|
Ёпрст надо пытать, он шарит.
|
|||
12
big
22.03.23
✎
16:20
|
А это что? Автор хочет записи в таблицы 1С добавить?? И без участия 1С при этом?
|
|||
13
CaIIIka
22.03.23
✎
16:37
|
(11) Спасибо, но это не параметризированный запрос, а обычный запрос, где текст составлен динамически :)
Так у меня тоже работает, но дольше, чем хотелось. Запрос.Выполнить("insert into VO (FIL, CODE, OST, REZ) Values('"+ПрефФил+"','"+пКод+"',"+пОстаток+","+пРезерв+")"); (12) Вы отчасти правы. Только таблица даже не 1С-ная. |
|||
14
uno-group
22.03.23
✎
16:44
|
А обычный Xbase если индексы задействовать не быстрее будет
|
|||
15
CaIIIka
22.03.23
✎
16:48
|
(14) По давним ощущениям из прошлых лет как-то не быстро все было. Может в памяти сравнение с SQL остались. Но, стоит попробовать. Если SQL бы однозначно победил, то запись в файл - не факт. Спасибо за идею!
|
|||
16
big
22.03.23
✎
16:50
|
(15) А sqlite не рассматривали как альтернативу?
|
|||
17
CaIIIka
22.03.23
✎
16:54
|
(15) Не, не рассматривал. Это базу по типу как на MS SQL переводить надо, с соответствующими доработками?
|
|||
18
CaIIIka
22.03.23
✎
16:55
|
* (16)
|
|||
19
Злопчинский
22.03.23
✎
16:55
|
(16) И я о том же.
и штатно 1Ска с ДБФ работает весьма шустро. |
|||
20
Злопчинский
22.03.23
✎
16:58
|
(17) нет. это ВК 1SQLite для дбфных клюшек
прямые запросы |
|||
21
CaIIIka
22.03.23
✎
17:01
|
(16),(20) Ух ты. Поизучать нужно.
Я долгие годы в 7.7 по большей части на SQL работал, где все и так по максимуму было и все устраивало. Лишь функционала платформы со временем не хватать стало. Сейчас, спустя еще годы работы на 8-ке попросили на 7.7 файловой пошаманить. Поэтому могу очевидные для многих вещи не знать. |
|||
22
big
22.03.23
✎
17:02
|
(17) ИМХО стоит попробовать
|
|||
23
CaIIIka
22.03.23
✎
17:06
|
Спасибо!
|
|||
24
Djelf
22.03.23
✎
17:42
|
И как же тут уже не влезть в тему ;)
Ветка обсуждения: https://www.1cpp.ru/forum/YaBB.pl?num=1214205575 Обновления: https://cloud.mail.ru/public/9znr/ZJ6ULE9aR Для 8ки orefkov сделал это: v8sqlite - нативная ВК для работы из 1С c базами sqlite |
|||
25
orefkov
22.03.23
✎
18:35
|
(21)
Без ложной скромности скажу, что для дбфной версии клюшек ничего лучше, чем 1sqlite вы вряд ли найдёте, тем более с доработками уважаемого Djelf. Если же добавить 1С++ и класс ПрямойЗапрос - можно даже универсальные запросы писать, работающие и в SQL, и в DBF. |
|||
26
alyuev
23.03.23
✎
12:19
|
(25) Поддерживаю!
|
|||
27
Злопчинский
24.03.23
✎
10:54
|
а еще для типа файловых клюшек было типа клиент-сервер
кто-то даже на нем успешно базы крутил |
|||
28
Злопчинский
23.03.23
✎
16:57
|
тьфу холера
вицшкер = dbwirth |
|||
29
Djelf
23.03.23
✎
18:35
|
(27) Это совсем другое. Не парь мосх ТС!
|
|||
30
Злопчинский
23.03.23
✎
19:47
|
(29) приготовленное на парУ - полезно!
|
|||
31
ЯнСмит
24.03.23
✎
09:28
|
когда-то попадалось подробное описание для 1SQLite ... третий день не могу найти =((
|
|||
32
orefkov
24.03.23
✎
09:38
|
(31) Есть дока в chm - https://cloud.mail.ru/public/9znr/ZJ6ULE9aR/1sqlite.chm - не то?
|
|||
33
ЯнСмит
24.03.23
✎
10:28
|
(32) там что-то вроде учебника было с примерами, но и за chm большое спасибо
|
|||
34
Djelf
24.03.23
✎
10:38
|
(33) Тогда видимо то о чем ты говорищь это: https://script-coding.com/Direct_queries.html
Для 1sqlite ничего подобного никогда не было. Небольшие отличия есть, например $Справочник.Номенклатура нужно в 1sqlite писать как Справочник_Номенклатура или [Справочник.Номенклатура], но это не так страшно. |
|||
35
Chai Nic
24.03.23
✎
10:48
|
Параметризированные запросы в характерных для 1с задачах не нужны.
|
|||
36
ЯнСмит
24.03.23
✎
10:56
|
(34) ага, похоже оно и есть, респект )
|
|||
37
Djelf
24.03.23
✎
10:58
|
(35) В погоне за микросекундами, потраченными на подготовку запроса очень даже нужны и полезны.
Для разбора json средствами sqlite еще более полезны (текст запроса для подготовки становится на порядок меньше, и следовательно подготовка запроса становится быстрее). А при работе с поставщиком данных и установке фильтров без них вообще никуда. |
|||
38
orefkov
24.03.23
✎
11:47
|
(27)
Была и ещё и такая разработка, как "Dbeng32" - https://infostart.ru/public/15211/ К дбфной 1С вместо родного движка прикручивался "Advantage" клиент-сервер. Работало вроде быстрее родного движка, по крайней мере в отчётах. К сожалению, разработка была несовместима ни с OLEDB запросами через VFP драйвер, ни с 1sqlie. Для прямого доступа из языка 1С автор реализовал только навигационный метод, типа "открыть таблицу NNN, перейти на запись такую-то, прочитать поле такое-то". Хотя вполне можно было добавить в 1sqlite виртуальные таблицы для своей разработки. Но автор очень не любил sql, и больше радел за навигационный подход, а народу такое как-то не зашло. Тем более что народ в основном пересадили в RDP, и проблемы сетевой работы с дбф забылись. |
|||
39
Arbuz
24.03.23
✎
14:55
|
(36) Я тоже когда-то пытался въехать в 1sqlite и никак не мог понять с какой стороны кусать (я ещё и не знал SQL почти). Никакой цельной доки нет. Но предупреждаю сразу: теперь я не могу без прямых запросов совсем! Подсел конкретно. На все родные способы, особенно на чорные запросы - смотрю как на говно. Если туда (на сторону движка скуля) переделать большую часть логики по выборке, то типичное ускорение составляет пару порядков. Да и просто удобнее, возможностей больше.
(27) Я давно использую и не нарадуюсь. В том числе с разными мд'шками, выделенными транзакциями на чтение и кешированным каналом клиенты-сервер через впн. Скорость - как-будто локально база *смайл_в_ужасе* Толик Wirth - реально гений (был?). Жаль он так и не допилил перевод всего движка на базу скулайта. Сейчас на любом калькуляторе клюшки на этих костылях (в том числе 1спп, формекс, йоксель и т.п. по вкусу) просто пробивают звуковой барьер. Как по скорости работы, так и по скорости доработки. А потом поворачиваешься и дальше ждёшь когда снеговик отпустит на сверхсовременном железе. Хотя конечно клюшки и морально устарели, и есть у них родовые уродства, навроде мертвячего UI, но бегают они более чем резво и стабильно. And here we are an outcast cult of fanatical guardians of the dark knowledge of this undead ))) |
|||
40
Djelf
24.03.23
✎
15:26
|
(39) Это я "тормоз" тогда был, Wirth в последних сообщениях был не против рассекретить исходники движка баз на sqlite.
Виноват (простить себе не могу). Упустил момент. Возможно смог бы довести до турбо варианта, еэта его штука работала хорошо, но слегка тормозила. Для файл-сервера бесплатная версия тут: https://cloud.mail.ru/public/C3fY/CWQwnhy5L Бережно ее храню.А Wirth действительно гений, осилить такое в одиночку - это невероятно. |
|||
41
Злопчинский
24.03.23
✎
16:23
|
(39) а работа с dbwirth оставляет возможность работы с запрсоами на 1SQlite?
|
|||
42
Злопчинский
24.03.23
✎
16:25
|
(40) еще бы туда какое-нить описание/доку что как куда ставить для клюшек и запуска базы на этом движке..
. вин10 кстати не дает скачать |
|||
43
obs191
24.03.23
✎
16:32
|
Даёт :)
|
|||
44
Arbuz
24.03.23
✎
17:34
|
(41) Да, всё работает, не только 1sqlite, но и всякое другое.
(42) Там внутри есть пдф описание-инструкция. Достаточно внятное. |
|||
45
Злопчинский
24.03.23
✎
18:23
|
(44) внутри (40) - нет. а ты какую ссылку имеешь в виду?
|
|||
46
MWWRuza
24.03.23
✎
19:01
|
Как нет, когда есть? Устанавливаешь сервер(запускать не нужно, пока не решишь что это тебе надо :-) ), и в каталоге, куда поставится будет подкаталог doc, там внутри PDF-ка...
|
|||
47
Злопчинский
24.03.23
✎
19:02
|
(46) а, так это самораспоковывающаяся штука?
|
|||
48
Злопчинский
24.03.23
✎
19:02
|
спсб.
|
|||
49
MWWRuza
24.03.23
✎
19:10
|
(47) Ага.
|
|||
50
Chai Nic
24.03.23
✎
20:55
|
(37) "В погоне за микросекундами, потраченными на подготовку запроса очень даже нужны и полезны."
Это если запрос в таком диком цикле по миллионам итераций, где эти микросекунды способны проявить себя. |
|||
51
Злопчинский
24.03.23
✎
22:45
|
(50) Копейка рубль бережет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |