Имя: Пароль:
1C
1С v8
Запрос к 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/
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший