|
|
|
Запрос к DBF через ADODD.Connection | ☑ | ||
|---|---|---|---|---|
|
0
korobovartyom13
19.01.18
✎
17:43
|
Проблема. понадобилось обратиться к базе ФИАС. Нашли решение, может оно и кривое, но все же. Сложили тихо спокойной все фалы в формате dbf в папочку и решили обращать к ним, дабы не грузить в базу, ибо общий объем всех dbf около 3 гб.
все это мероприятие расположено на общей форме, собственно код процедуры ниже: &НаСервере Процедура ПодобратьАдресНаСервере() СтрокаПодключения="DRIVER={Microsoft dBase Driver (*.dbf)}"; АДО = Новый COMОбъект("ADODB.Connection"); Попытка АДО.Open(СтрокаПодключения); Исключение Сообщить("Невозможно установить подключение ADODB.Connection"); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; АДО.DefaultDatabase = "C:\ADDROB"; Command = Новый COMОбъект("ADODB.Command"); RecordSet = Новый COMОбъект("ADODB.RecordSet"); Command.ActiveConnection = АДО; Command.NamedParameters = True; Command.CommandText= "SELECT DISTINCT | t1.FORMALNAME AS nameTown, | t2.FORMALNAME AS nameParent, | t3.FORMALNAME AS nameStreet |FROM | ADDROB"+КодРегиона+" t1, ADDROB"+КодРегиона+" t2, ADDROB"+КодРегиона+" t3 | | WHERE | t1.FORMALNAME LIKE @p1 AND t3.FORMALNAME LIKE @p2 AND t1.ENDDATE > @p3 AND t2.ENDDATE > @p4 AND t3.ENDDATE > @p5 AND t1.PARENTGUID = t2.AOGOUID AND t1.AOGUID = t3.PARENTGUID"; мТекущаяФорматнаяДата = Формат(текущаяДата(),"ДФ=гггг-ММ-дд"); //Command.CreateParameter(Name, Type, Direction, Size, Value) //name - начинаетсяс @+буква //type - строка(129), булево(11), дата(133)(yyyy-mm-dd), число (20) - 8 байт со знаком //direction = 1(то что параметр входной) //size - длина //value - значение Param = Command.CreateParameter("@p1",129,1,100,"%"+СокрЛП(НаименованиеНасПункта2)+"%"); Command.Parameters.Append(Param); Param = Command.CreateParameter("@p2",129,1,100,"%"+СокрЛП(НаименованиеУлицы2)+"%"); Command.Parameters.Append(Param); Param = Command.CreateParameter("@p3",133,1,,мТекущаяФорматнаяДата); Command.Parameters.Append(Param); Param = Command.CreateParameter("@p4",133,1,,мТекущаяФорматнаяДата); Command.Parameters.Append(Param); Param = Command.CreateParameter("@p5",133,1,,мТекущаяФорматнаяДата); Command.Parameters.Append(Param); Попытка RecordSet = Command.Execute(); Исключение Сообщить(ОписаниеОшибки()); АДО.CLose(); Возврат; КонецПопытки; Пока RecordSet.EOF=0 Цикл Сообщить(RecordSet.Fields("nameParent").value+" "+RecordSet.Fields("nameTown").value+" "+RecordSet.Fields("nameStreet").value+" "); RecordSet.MoveNext(); КонецЦикла; АДО.Close(); КонецПроцедуры Расскажите, в чем косяк? Строка: RecordSet = Command.Execute(); ОШ: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Драйвер ODBC dBase] Too few parameters. Expected 6. Причем "Select * from ADDROB"+КодРегиона; отрабатывает на ура) |
|||
|
1
Franchiser
19.01.18
✎
18:31
|
Должно быть 6 параметров в Append, у тебя 5
|
|||
|
2
korobovartyom13
19.01.18
✎
18:35
|
Franchiser, я тоже умею читать по-английски и понимаю, что там написано. Где в тексте запроса объявление 6ого параметра?
|
|||
|
3
Franchiser
19.01.18
✎
18:38
|
Напиши сообщить(command.parameters.count)
|
|||
|
4
korobovartyom13
19.01.18
✎
18:44
|
Franchiser, действительно, пишет аж 7. Знаешь что ему нужно?
|
|||
|
5
korobovartyom13
19.01.18
✎
18:55
|
В общем, пока не дошел до RecordSet = Command.Execute(); - было 5 параметров.
заходит внутрь Execute() , ожидает аж 7, получается. Кто-нибудь понимает, в чем подвох? |
|||
|
6
Sserj
19.01.18
✎
18:59
|
Помоему вместо
Param = Command.CreateParameter("@p1",129,1,100,"%"+СокрЛП(НаименованиеНасПункта2)+"%" Должно быть Param = Command.CreateParameter("@p1",129,1,100,"'%"+СокрЛП(НаименованиеНасПункта2)+"%'" Ну и в следующий строке апостроф тоже. |
|||
|
7
Ёпрст
гуру
19.01.18
✎
19:08
|
(0)
забить болт на параметры в адо и писать обычный запрос через конкатенацию строк. |
|||
|
8
NorthWind
19.01.18
✎
20:16
|
(5) пробегитесь по коллекции параметров и выведите в окно сообщений их имена. Тут и поймете, в чем подвох. И кстати да, обработка параметров может очень сильно зависеть от текущего драйвера и движка, поэтому (7) может быть и прав - не исключено, что в данном конкретном случае разумнее не геморроиться с параметрами.
|
|||
|
9
Franchiser
20.01.18
✎
01:52
|
Уменьшить количество 0 параметров, и проверь сколько их останется, попробуй не использовать именованные параметры, в запрос нужно написать знаки вопроса, коллекция параметров обходится если не ошибаюсь через item(0), item(1) и тд
|
|||
|
10
Franchiser
20.01.18
✎
01:57
|
Здесь похожая проблема : http://www.sql.ru/forum/1146713/error-07002-driver-odbc-dbase-slishkom-malo-parametrov-trebuetsya
Как я понял с вопросами должно заработать |
|||
|
11
Franchiser
20.01.18
✎
02:16
|
Ещё по теме: "Если попытаться использовать привычный вариант @paramName вместо знака вопроса в sql-запросе, то вернется ошибка ODBC «Слишком мало параметров»."
http://noservice.ru/rabota-s-dbf/ |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |