Имя: Пароль:
1C
1С v8
Работа с DBF через ADO
,
0 tciban
 
20.12.19
13:37
Уважаемые коллеги! Нужна, помощь, совет в таком деле:
Есть некая программа которая сбрасывает результаты своей жизнедеятельности для обмена с 1С в DBF. Все они лежат в сетевой папке, имена dbf не в формате 8.3, длинные, потому хочу работать с ними через ADO. Файлики DBF валятся в сетевую папку, валятся и изменяются часто и их много, несколько сотен.
Написал следующий код:
        АДО = Новый COMОбъект("ADODB.Connection");
    АДО.Open("Provider=Microsoft.Jet.OLEDB.4.0;" +
        "Data Source=" + Path + ";" +
        "Extended Properties=""DBASE IV;"";");
    
    Выборка = АДО.Execute("Select * from "+Файл.Имя);
Выполняю для одного из файлов - имею ошибку
Ошибка при вызове метода контекста (Execute)
    Выборка = АДО.Execute("Select * from "+Файл.Имя);
по причине:
Произошла исключительная ситуация (Microsoft JET Database Engine): Слишком сложный запрос.

или такую:
Ошибка при вызове метода контекста (Execute)
    Выборка = АДО.Execute("Select * from "+Файл.Имя);
по причине:
Произошла исключительная ситуация (Microsoft JET Database Engine): Ошибка синтаксиса в предложении FROM.
Или еще другие бывают. В общем читает через раз.

Есть предположение, что все это потому что слишком много и часто файлики меняются, у ADO крыша едет :)
Посоветуйте что делать? Может вписать в строку соединения или еще как то указать, что открываю только для чтения? Илои еще какие то хитрые параметры использовать?
1 Гость из Мариуполя
 
гуру
20.12.19
14:28
Копировать/перемещать из сетевой папочки в локальную, а потом работать с ними локально.
Во-первых, гарантированно никакая другая программка их уже трогать и изменять не будет,
во-вторых - открывать dbf локально оно как-то.. ммм... более комильфо, нежели чем по сети в сетевой шаре.
2 tciban
 
20.12.19
14:38
Да вот как то хотелось уйти от этого клопирования, оно так то и в сетевой харе вполне бодро открывает. но через раз... Как то бы разобраться с захватом/блокировкой
3 tciban
 
20.12.19
15:07
up
4 Ёпрст
 
20.12.19
15:36
(0)
Файл.Имя то хоть что возвращает, для начала ?
5 tciban
 
20.12.19
16:06
(4) Фокус вы том, что во многих случаях вполне себе хорошо открывается dbf !
6 Ёпрст
 
20.12.19
16:08
(5) что возвращает Файл.Имя ?
Посмотри в жуколове
7 evgeniy_n
 
20.12.19
16:18
Поправьте, если ошибаюсь, но на мой взгляд, если в имени файла будет пробел или какой-нибудь "интересный" символ, то запрос выдаст ошибку.
8 Ёпрст
 
20.12.19
16:19
(7) да, экранировать надо
9 Ёпрст
 
20.12.19
16:19
ну и пробовать можно разные провайдерв, оледб, асе ..и т.д
10 Ёпрст
 
20.12.19
16:21
на vfpoledb можно настроить, чтоб файло тока на чтение открывалось запросом, тогда его несколько чертей могут читать одновременно, например
11 Garykom
 
гуру
20.12.19
16:41
(0) Сейчас в моде веб-сервисы так что берется нечто что умеет dbf превратить в rest и по http из 1С того самого.
12 Sasha_H
 
20.12.19
16:42
А попробовать через внешнии источники данных?
13 Сияющий в темноте
 
20.12.19
18:46
я для серевого доступа писал свою читалку дбф,так как длинные имена и сетевые пути никто кушать не хотел.
14 Злопчинский
 
20.12.19
18:47
(0) "имена dbf не в формате 8.3, длинные,"
ты не поверишь - но файлы дбф с длинными именами вполне можно перебрать по коротким именам, оно у них есть... вроде...?
15 ШтушаКутуша
 
21.12.19
16:13
(0) Выборку т.е. набор записей лучше получать через recordset.
через cnn.Execute глючно
16 craxx
 
21.12.19
17:22
(0) в пень АДО. Передавай на сервер и присваивай короткие имена.
17 runoff_runoff
 
21.12.19
17:54
как насчет заменить звёздочку каким-нибудь полем, тоже сложный запрос?
18 Djelf
 
21.12.19
18:12
(0) > Есть предположение, что все это потому что слишком много и часто файлики меняются, у ADO крыша едет :)
Предположение вероятно правильное.
Допустим ADO пытается достучаться до файла который именно в этот момент меняется.
Что должно быть? Вероятно не "Ошибка синтаксиса в предложении FROM", хотя это тоже возможно...
Попробуй блокировать файл монопольно (и разблокировать естественно), перед началом запроса.
> Все они лежат в сетевой папке
ADO работает по сети. Почему бы не установить драйвер на той машине где находится сетевая папка и обращаться к нему?
19 Смотрящий
 
21.12.19
18:16
(0) "Select * from [" + Файл.Имя + "]"
20 Djelf
 
21.12.19
18:16
Я бы написал демона на Golng, который бы собирал данные из dbf`ок и перекидывал их в более адекватное хранилище.
На Golang это сделать даже проще чем на C#
21 ШтушаКутуша
 
21.12.19
19:16
(0) не слушай никого получай набор записей, только через recordset
22 Garykom
 
гуру
21.12.19
20:01
(20) +100

Там писать полчаса-час для меня сча например и сразу это предложил (11) не уточняя на чем ваять
23 craxx
 
21.12.19
20:27
(22) а нахрена? загрузить в ДвоичныеДанные, затем выгрузить с коротким именем, затем уже работать штатными средствами 1С
24 Бертыш
 
21.12.19
23:29
Обернуть в кавычки длинное имя файла в котором возможно есть пробелы не предлагать?
25 kubik_live
 
22.12.19
11:10
Смени правайдера на vfpoledb.1
Вот пример, все работает, в т.ч. и с  MEMO

PathFile=Набор.PathFileФизическиеЛица;
    NameFile=Набор.NameFileФизическиеЛица;
    
    DBConn = Новый COMОбъект("ADODB.Connection");
    DBConn.Open("Provider=vfpoledb.1;Data Source="+PathFile+";Collating Sequence=Russian;");
    //Делаем выборку
    DataSize = DBConn.Execute("Select Count(*) As NRec from ["+NameFile+"]");
    КолвоЗаписей=Число(DataSize.Fields("NRec").value);
    
    Data = DBConn.Execute("Select * from ["+NameFile+"]");
26 EvgeniuXP
 
22.12.19
15:58
2 - 20.12.19 - 14:38
Да вот как то хотелось уйти от этого клопирования, оно так то и в сетевой харе вполне бодро открывает. но через раз... Как то бы разобраться с захватом/блокировкой

Будете друг-другу мешать - кто выгружает и кто читает - т.к. один ресурс.
27 Сияющий в темноте
 
23.12.19
09:09
если правильно писать того,кто выгружает,то проблем быть не должно,а инчае граблехождение обеспечено.
28 tciban
 
23.12.19
09:23
Спасибо всем кто откликнулся! Предложений много? некоторые пока не понял :), буду пробовать, начну с recordset
29 tciban
 
23.12.19
09:28
(27) написать того, кто выгружает не можно - другой разработчик будет.
30 tciban
 
23.12.19
09:29
а вторым шагом попробую сменить провайдера на vfpoledb.1
31 Djelf
 
23.12.19
09:47
(0) А время файлов меняется? Может будет достаточно обрабатывать файлы через минуту после их выгрузки?