Имя: Пароль:
1C
1С v8
Подключение к dbf из 1С8 через драйвер фокспро 9
, , ,
0 Loko
 
04.08.16
05:34
всем привет! есть старая прога (на фокспро), которая хранит информацию в дбф-файле. нужно настроить обмен: из 1С добавлять туда новые записи. проблема в том, что в этой файле есть memo поля. просто добавить через XBase не получается.
установили на серваке фокспро 9. пытаюсь подключится через ADODB к файлу. не получается.

СтрокаПодключения="DRIVER={Microsoft FoxPro VFP Driver (*.dbf)};SourceDB=\\1C\data\; SourceType=DBF; Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=Yes;";
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open(СтрокаПодключения);

Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию



на серваке: windows (64) 2012. а odbc драйвер 32 разрядный может в этом проблема?
1 Loko
 
04.08.16
05:41
1С на серваке тоже 64 разрядная. когда в кофигураторе создаю новый внешний источник данных, видит только драйвер скл (64).
2 Loko
 
04.08.16
06:04
со своего компа windows 7 (32) получилось подключиться к дбф-ке. в т.ч. считать поля memo

ОлеДБ = Новый COMОбъект("ADODB.Connection");
Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Mode=ReadWrite;Collating Sequence=MACHINE";
ОлеДБ.Open(Соединение);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = ОлеДБ;
ТекстЗапроса = "
|select  *
|from sf01
|";
Command.CommandText = ТекстЗапроса;    
RecordSet = Новый COMОбъект("ADODB.RecordSet");    
RecordSet = Command.Execute();

вопрос 1: в чем разница между первым моим подключением (через драйвер) и нынешним (через провайдер)?
вопрос 2. все таки дело в разрядности виндовса? на серваке не работает также.
3 Loko
 
04.08.16
06:04
вопрос 3. как сделать запись в дбф-ку эту?
4 Kandellaster
 
04.08.16
06:10
скормить запросик с INSERT в Command
5 Loko
 
04.08.16
06:17
(4) запрос - это просто чтение файла. а мне нужно добавить новую запись.
6 Гобсек
 
04.08.16
06:19
Если создать файл dbf средствами 1С, то любая версия foxpro прочитает его без проблем.
7 Kandellaster
 
04.08.16
06:24
(5)
СтрокаЗапрос = "INSERT INTO tablename
VALUES ('значение', 'значение', 'значение');"
Command.CommandText = СтрокаЗапрос;    
RecordSet = Новый COMОбъект("ADODB.RecordSet");    
RecordSet = Command.Execute();

и таки не сработает штоле?
8 Loko
 
04.08.16
06:26
(6) вся проблема с полями memo. не работает 1С с этими полями.
9 Loko
 
04.08.16
06:26
(7) попробую. спасибо
10 NorthWind
 
04.08.16
06:28
(0) разница в том, что в первом случае вы пытаетесь использовать провайдер для odbc, который, в свою очередь, должен читать файл через драйвер odbc. Во втором случае вы используете провайдер visual fox pro, который работает с файлом напрямую.
11 NorthWind
 
04.08.16
06:30
Битность провайдеров должна совпадать с битностью процесса. Т.е. для сервака надо найти 64-битные провайдеры
12 NorthWind
 
04.08.16
06:31
или поставить 32-битный сервак, что вряд ли правильно
13 Loko
 
04.08.16
06:31
(10) ок. понял. спасибо.
а на сервере не работает именно из-за разрядности?
вообще в природе есть фокс про 64 для виндовс сервер 2012?
14 NorthWind
 
04.08.16
06:32
А провайдер Access фокспрошные файлы не ест? Он на МС 64-битный лежит...
15 NorthWind
 
04.08.16
06:37
Вообще поскольку ADO/OLEDB технология от Майкрософт, то я там бы и поискал провайдеров, могут быть вполне
16 Гобсек
 
04.08.16
06:38
(13)В нулевые годы Microsoft заявила, что разрабатывать 64-разрядную версию foxpro считает нецелесообразным и тем самым похоронила foxpro.
17 Loko
 
04.08.16
06:39
(14) смотрю на серваке в администрировании "Источники данных ODBC (64-разрядная версия)" там в драйверах только SQL Server стоит.
18 Loko
 
04.08.16
06:42
(7) ошибку выдает:
Произошла исключительная ситуация (Microsoft OLE DB Provider for Visual FoxPro): Must specify additional parameters.
19 Loko
 
04.08.16
06:51
(7) а, понял. я там наименования полей не указал. только значения.
20 Loko
 
04.08.16
07:47
(7) не идет все равно. не добавляется запись. видимо, как понимаю надо описать типы полей. Как это сделать?
21 Loko
 
04.08.16
07:56
Произошла исключительная ситуация (Microsoft OLE DB Provider for Visual FoxPro): Data type mismatch.
22 Горогуля
 
04.08.16
08:02
покажи уже какие значения и куда пытаешься писать
23 Loko
 
04.08.16
08:05
КаталогИБ = "D:\";
    
ОлеДБ = Новый COMОбъект("ADODB.Connection");
Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Mode=ReadWrite;Collating Sequence=MACHINE";
ОлеДБ.Open(Соединение);
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = ОлеДБ;
СтрокаЗапрос = "INSERT INTO sf01 (BKF, NFIR, PIND, BKN, TIND, KTEL, POZIV, FAKS, KODF, HZPODR, ADORG, IKODF, KODMG, OKONH, OKPO, KPP, FILIAL, URADRES, Pr_upr_uch, PR_KOMP, NFIR_OH, PRK_OBOR, PRK_ROST, OST_OPL, COMM_OST) VALUES ('0013139', 'тест', 'тест', 'тест', 'тест', 'тест', 'тест', 'тест', 'тест', 'тест', 'улан-удэ', 'тест', 'тест', 'тест', 'тест', 'тест', '1', 'тоже улан-удэ', '0', 'тест', 'тест', 'тест', 'тест', 'false', 'тест')";

Command.CommandText = СтрокаЗапрос;    
RecordSet = Новый COMОбъект("ADODB.RecordSet");    
RecordSet = Command.Execute();

там где тест - тип строка, где цифра - тип число, где фалсе - булево, где улан-удэ - мемо.
24 Горогуля
 
04.08.16
08:08
такое впечатление, что сплошь строки пытаешься писать
25 Loko
 
04.08.16
08:10
(24) т.е. только строку надо в кавычках? число без? а мемо и булево?
26 NorthWind
 
04.08.16
08:10
(17) ну не стоит - найдите и поставьте
27 Loko
 
04.08.16
08:13
(26) в (16) написали, что нету 64-ой
28 Горогуля
 
04.08.16
08:13
(25) не скажу. 'false' - ну явно строка же ;)
29 NorthWind
 
04.08.16
08:15
(27) посмотрите в сторону провайдера для Access, вполне может быть что он делает то что вам надо. Он 64-битный - есть, скачивается с MS бесплатно
30 Loko
 
04.08.16
08:17
(28) точно .f. или .t. надо
31 Loko
 
04.08.16
08:17
(29) ок
32 Loko
 
04.08.16
08:19
в общем, получилось добавить запись) неправильно указывал значения. строка в одинарных кавычках, число без кавычек через точку в дробной части, булево - .f. или .t.

теперь осталось разобраться с разрядностью...
33 Горогуля
 
04.08.16
08:20
>просто добавить через XBase не получается.
оно как-то аргументирует?
34 Loko
 
04.08.16
08:22
(33) XBase не работает с типом поля memo
35 Kandellaster
 
04.08.16
08:28
каким боком у тебя там улануде ?))
36 Loko
 
04.08.16
08:36
(35) улан-удЭЭЭЭЭЭ. живу здесь
37 Loko
 
04.08.16
08:37
еще вопрос возник. а есть какие-нить механизмы блокировки дбф-файла в момент когда я записи свои буду добавлять?
38 Kandellaster
 
04.08.16
08:38
(36) я тоже там, живу
39 Гобсек
 
04.08.16
08:42
(37)Если мне память не изменяет, то foxpro при начале добавления записи автоматически делает блокировку заголовка и снимает по окончании. По логике в твоем случае эту работу автоматически должен делать драйвер.
40 Loko
 
04.08.16
08:43
(39) ок
41 Loko
 
04.08.16
09:08
пробую через акцес:
ОлеДБ = Новый COMОбъект("ADODB.Connection");
Соединение = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" + КаталогИБ + ";Mode=ReadWrite;Collating Sequence=MACHINE";
ОлеДБ.Open(Соединение);

не открывается. ошибка:
{ВнешняяОбработка.ВыгрузкаВДБФ.Форма.Форма.Форма(80)}: Ошибка при вызове метода контекста (Open)
    ОлеДБ.Open(Соединение);
по причине:
Произошла исключительная ситуация (Microsoft Access Database Engine): Could not find installable ISAM.


провайдера мож неправильно указываю?
42 Горогуля
 
04.08.16
09:12
симптомы, причины, решения...
https://support.microsoft.com/en-us/kb/209805
43 Loko
 
04.08.16
09:17
да похоже нельзя открыть дбв через акцесс провайдер...
44 Loko
 
04.08.16
09:17
(43) дбф
45 Loko
 
04.08.16
09:26
СтрокаПодключения="DRIVER={Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx)};SourceDB=\\1c\data\Bulat\; SourceType=DBF; Exclusive=No;BackgroundFetch=Yes;Collate=Russian;Null=No;Deleted=Yes;";
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.Open(СтрокаПодключения);

а вот так соединение проходит)

только новая ошибка синтаксиса при добавлении записи:

Syntax error (missing operator) in query expression '.f.'.
как булево записывается в акцесе?
46 ovrfox
 
04.08.16
09:28
(43) Можно, но только стандарта DBASE III (без полей memo)
47 SSSSS_AAAAA
 
04.08.16
09:31
Боже мой, сколько (уж извините за резкость) чуши на ровном месте...
1. Фокс только 32-битный  и дрова к нему тоже только 32-битные.
2. Список 32-битных дров на 64-юитных системах отдельный и никак не связан со списком 64-битных дров.
3. OLE DB Provider и ODBC - две разных технологии построения драйверов доступа к базам данных. конкретно для фокса ODBC драверы дрвнее мамонтов. Все фоксовые форматы дбф поддерживает только VFP OLE DB Provider.
4. Во спасение от будущих граблей :) - даты надо писать в формате {^yyyy-mm-dd}

В принципе, сего должно хватить для решения обсуждаемой пробемы. Разумеется, если это использовать с головой. :_
48 Loko
 
04.08.16
09:37
(47) это мы уже выяснили. с 32-х битного виндовса нормально подключаюсь через VFP OLE DB Provider. все работает.

ты уж извини меня неумного, но то, что ты перечислил - все это уже мы выяснили выше. конкретно как с сервера 64 разрядного подключится к дбф-ке?
49 SSSSS_AAAAA
 
04.08.16
09:37
Добавчик:
5. В подавляющем большинстве случаев сервер 1с 32-битный и потому во всех этих случаях ни о каких 64-битных дровах не может быть и речи.
50 Loko
 
04.08.16
09:39
(49) я сразу написал в первом посте что у нас сервер 1С 64 разрядный
51 SSSSS_AAAAA
 
04.08.16
09:43
(48) Да, похоже, таки еще не выяснили, раз такой вопрос задаешь.
Ну так и что непонятно из (49)? 64-битные приложения в принципе не умеют пользоваться 32-битными дровами.

Работать исключительно из 1с-вского клиента, даже если он и вместе сервером 1с на одной машине.
52 NorthWind
 
04.08.16
12:52
53 NorthWind
 
04.08.16
12:54
единственное что - я, честно сказать, уже плохо помню, получится там мемо-поля читать или нет.
54 SSSSS_AAAAA
 
04.08.16
13:36
(53) Получится, если строку коннекта сменит на рабочую с VFP OLE DB Provider.
55 Loko
 
05.08.16
04:40
(52) http://www.connectionstrings.com/using-jet-in-64-bit-environments/

как понял dbf не открываются через этот провайдер в 64-разрядной системе.
56 Loko
 
05.08.16
04:58
на локальной базе все норм работает.

на серваке:
{ВнешняяОбработка.ВыгрузкаВДБФ.Форма.Форма.Форма(32)}: Ошибка при вызове метода контекста (Open)
    DBConn.Open("Provider=Microsoft.Jet.OLEDB.4.0;" +
по причине:
Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанный поставщик. Вероятно, он установлен неправильно.
57 Ёпрст
 
05.08.16
09:12
(56) дык поставь его, на серваке то. Чтоб хотя бы в udl был виден
58 Loko
 
08.08.16
09:40
подскажите синтаксис добавления даты в моем случае?

ДатаВ= Дата(Формат(DZAKL,"ДФ=dd.MM.yyyy"));

"INSERT INTO DOGOVOR VALUES ("+ДатаВ+")"

ошибка синтаксиса говорит
59 Ёпрст
 
08.08.16
09:43
Вот к такому виду приводи:
{d '2012-07-01'}
60 Loko
 
08.08.16
09:49
(59)т.е. дату мне так преобразовывать до инсерта:

Д = День(DZAKL);
М = Месяц(DZAKL);
Г = Год(DZAKL);

ДатаВ = "{d '"+Д+"-"+М+"-"+01+"'}";

?
61 Loko
 
08.08.16
09:49
ДатаВ = "{d '"+Д+"-"+М+"-"+Г+"'}";
т.е.
62 Loko
 
08.08.16
09:50
не идет так.

Произошла исключительная ситуация (Microsoft OLE DB Provider for Visual FoxPro): Произошла одна или несколько ошибок во время обработки команды.
63 Горогуля
 
08.08.16
09:50
видал в интернетах приколы по поводу даты. ^ перед или за { или что-то этакое.. ищи
64 Горогуля
 
08.08.16
09:50
+(63) в этой ветке тебе говорили даже
65 Loko
 
08.08.16
09:52
(64) ага в 47 увидел, попробую. спасиб
66 Горогуля
 
08.08.16
09:54
мущина! здесь же чат, а кто читает вчерашнее - тот лох
67 Loko
 
08.08.16
09:56
(66) ну не прочел. бывает.

запись, в общем, идет. но даты пустые...
68 Горогуля
 
08.08.16
09:57
(67) наверное, что-то не так, не?
69 Loko
 
08.08.16
10:00
ага, разобрался. числовые группы убрал в году)

все, работает. всем спасибо!
70 Горогуля
 
08.08.16
10:03
мда.. спасибо тебе (это не сарказм). у меня пока сохраняется вера в человечество. пока правильного намёка достаточно. и ответного "спасибо", конечно ;)
71 Ёпрст
 
08.08.16
10:10
(62) всё работает:

    КаталогИБ = "f:\";
    ОлеДБ = Новый COMОбъект("ADODB.Connection");
    Соединение = "Provider=VFPOLEDB.1;Data Source=" + КаталогИБ + ";Mode=ReadWrite;Collating Sequence=MACHINE";
    ОлеДБ.Open(Соединение);
    Комманд = Новый COMОбъект("ADODB.Command");
    Комманд.ActiveConnection = ОлеДБ;
    Комманд.CommandText = "insert into test ([date]) values ({d '2012-07-01'})";
      Комманд.Execute();


провайдер, этот, если че

https://www.microsoft.com/en-us/download/confirmation.aspx?id=14839
72 Loko
 
23.08.16
11:06
всем привет! это снова я)

в общем, получилось подключиться к дбф-ке через Provider = Microsoft.Ace.OLEDB.12.0 с сервака64. но проблема в том, что с мемо полями, как я понял, этот провайдер не работает (другие дбф-ки без мемо полей читает норм).

все-таки как Епрст подключается через Provider=VFPOLEDB.1? у меня упорно провайдера не видит. драйвер установлен также по ссылке как в (71).

скидываю скрин источников данных на серваке, смущает дата драйвера (1999 год). может в этом проблема?
http://upload.akusherstvo.ru/image1112606.png
73 Loko
 
23.08.16
11:07
вот здесь такая же проблема была, но там мемо полей не было. и тогда у Епрсты все ок было...
v8: как записать дбф через adodb.connection на х64 сервере
74 Ёпрст
 
23.08.16
11:08
(72) я хз, чего там у вас за серваки, у нас 2012 x64, хотя и на  2003 x64 hf,jnftn/
75 Loko
 
23.08.16
11:12
(74) а можете скрин сделать источников одбс как у меня в (72)?