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