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

1С:Предприятие ::

Метки: 

Запрос к DBF через ADODD.Connection

Я
   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"+КодРегиона; отрабатывает на ура)
 
  Рекламное место пустует
   Franchiser
 
1 - 19.01.18 - 18:31
Должно быть 6 параметров в Append, у тебя 5
   korobovartyom13
 
2 - 19.01.18 - 18:35
Franchiser, я тоже умею читать по-английски и понимаю, что там написано. Где в тексте запроса объявление 6ого параметра?
   Franchiser
 
3 - 19.01.18 - 18:38
Напиши сообщить(command.parameters.count)
   korobovartyom13
 
4 - 19.01.18 - 18:44
Franchiser, действительно, пишет аж 7. Знаешь что ему нужно?
   korobovartyom13
 
5 - 19.01.18 - 18:55
В общем, пока не дошел до RecordSet = Command.Execute(); - было 5 параметров. 

заходит внутрь Execute() , ожидает аж 7, получается.

Кто-нибудь понимает, в чем подвох?
   Sserj
 
6 - 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)
забить болт на параметры в адо и писать обычный запрос через конкатенацию строк.
   NorthWind
 
8 - 19.01.18 - 20:16
(5) пробегитесь по коллекции параметров и выведите в окно сообщений их имена. Тут и поймете, в чем подвох. И кстати да, обработка параметров может очень сильно зависеть от текущего драйвера и движка, поэтому (7) может быть и прав - не исключено, что в данном конкретном случае разумнее не геморроиться с параметрами.
   Franchiser
 
9 - 20.01.18 - 01:52
Уменьшить количество 0 параметров, и проверь сколько их останется, попробуй не использовать именованные параметры, в запрос нужно написать знаки вопроса, коллекция параметров обходится если не ошибаюсь через item(0), item(1) и тд
   Franchiser
 
10 - 20.01.18 - 01:57
Здесь похожая проблема : http://www.sql.ru/forum/1146713/error-07002-driver-odbc-dbase-slishkom-malo-parametrov-trebuetsya
Как я понял с вопросами должно заработать
 
  Рекламное место пустует
   Franchiser
 
11 - 20.01.18 - 02:16
Ещё по теме: "Если попытаться использовать привычный вариант @paramName вместо знака вопроса в sql-запросе, то вернется ошибка ODBC «Слишком мало параметров»."
http://noservice.ru/rabota-s-dbf/


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