|   |   | 
| 
 | Работа с 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) А время файлов меняется? Может будет достаточно обрабатывать файлы через минуту после их выгрузки?     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |