Имя: Пароль:
1C
1С v8
Некорректная кодировка после выполнения первой записи VFPOLEDB
0 DimaDmitriy
 
11.08.21
12:06
День добрый!
Исходная задача: необходимо писать в DBF-файлы через 1С. Условия таковы, что эти базы рабочие и ежедневно используются программами на FoxPro.
Поэтому использовать стандартный XBase - нельзя. Ибо базы всё время открыты.
Использую следующий код для записи в DBF:


    Connection = Новый COMОбъект("ADODB.Connection");

    Соединение = ("Provider=vfpoledb;  
                 |Data Source=""" +Путь+""";
                  |Extended Properties=DBASE IV;
                         |Codepage=1251;");

    Connection.Open(Соединение);

    ТекстЗапроса = "";
    
    ТекстЗапроса = СоставитьТекстЗапроса(Данные); // составление запроса insert по некоторым данным
    
    Command = Новый COMОбъект("ADODB.Command");
    RecordSet = Новый COMОбъект("ADODB.Recordset");
    Command.ActiveConnection = Connection;
    Command.CommandText = ТекстЗапроса;
    RecordSet = Command.Execute();
    
    Command = Неопределено;

И, собственно, вот в чём проблема: После запуска конфигурации и выполнения первой записи - всё отрабатывает нормально. Но вторая и последующие записывают с некорректной кодировкой.
Не могу понять в чём тут может быть проблема. Пробовал и методы Close() для Connection и Command. Пробовал кодировку записываемых строковых значений менять всё равно получается вот такая белиберда:

Первая запись в базе: "ПРУТОК ДКРНП Л63"
Вторая и последующие: "IDOOIE └EDII E63"

Числа и даты пишутся нормально.
1 Вафель
 
11.08.21
12:08
xbase же может только на чтение открывать
2 DimaDmitriy
 
11.08.21
12:11
(1) нет, у конструктора есть соответствующий параметр. Но только в монопольном режиме, что мне не подходит
3 Вафель
 
11.08.21
12:13
(2) только чтение, но в монопольном режиме? это как?
4 DimaDmitriy
 
11.08.21
12:16
(3) При создании объекта XBase, в конструкторе параметр "ТолькоЧтение" переопределяется на Ложь и можно писать (но только в монопольном режиме)
5 Вафель
 
11.08.21
12:18
(4) так тебе писать или читать?
6 acht
 
11.08.21
12:18
(0)
7 acht
 
11.08.21
12:18
(0) В заголовке dbf какая кодировка стоит, перед тем как ты туда что-то писать собираешся?
8 DimaDmitriy
 
11.08.21
12:18
(5) писать
9 DimaDmitriy
 
11.08.21
12:19
(7) 1251
10 acht
 
11.08.21
12:20
(9) А после того, как ты сделал первую запись - меняется?
11 DimaDmitriy
 
11.08.21
12:25
(10) а в какой момент и где это лучше глянуть?
12 acht
 
11.08.21
12:33
(11) После записи, сразу в файле. 29й байт по-моему.
Надо понять в какой кодировке оно у тебя пишет и кто ее ставит - твой фокспро или изначальная программа
13 acht
 
11.08.21
12:34
И заодно - какая программа показывает тебе строки в некорректной кодировке? сторонний вьювер или изначальная программа?
14 DimaDmitriy
 
11.08.21
12:44
(13) 3 программы:
- простое считывание значений через Xbase в 1С
- просмотр базы через FoxPro
- DBFNavigator
- ну и эксцель
Через что ни открывай - везде одна запись корректна - вторая нет
15 DimaDmitriy
 
11.08.21
12:57
(12) проверил кодировку 866 - не меняется перед и после записей
16 Вафель
 
11.08.21
12:58
Так 1251 или 866?
17 DimaDmitriy
 
11.08.21
12:59
(16) 866 все жё
18 DimaDmitriy
 
11.08.21
13:05
Поменял в строке соединения codepage=866 - никакого эффекта
19 DimaDmitriy
 
11.08.21
13:06
Вообще такое ощущение, что после первой записи соединение не закрывается полностью и это вызывает какую-то ошибку...
20 Вафель
 
11.08.21
13:08
А где ты брал строку соединения?
Что то в инете они другие
21 DimaDmitriy
 
11.08.21
13:14
(20) да вот где-то в инете и брал.
Сначала я пробовал писать через microsoft.jet.oledb.4.0 - но он при записи ломал индексы и в Fox-е лечилось только переиндексацией базы.
Строка соединения, походу от него и досталась.
22 acht
 
11.08.21
13:18
(18) А ты прямо на бою проверяешь или на отдельной базе, куда никто кроме тебя не пишет?
Ну, чтобы исключить параллельные изменения, производимые не тобой.
23 acht
 
11.08.21
13:20
(21) https://www.connectionstrings.com/visual-foxpro/
Попробуй варианты с "Microsoft Visual FoxPro ODBC Driver"
24 DimaDmitriy
 
11.08.21
13:20
(22) сейчас отдельная, конечно
25 DimaDmitriy
 
11.08.21
13:32
Попробовал следующие:

    Соединение =  "Provider=vfpoledb;  
                  |Data Source=""" +Путь+""";
               |Collating Sequence=machine";


    Соединение =  "Provider=vfpoledb;  
                  |Data Source=""" +Путь+""";
                  |Collating Sequence=general";
Нет эффекта.

Попробовал такое:

    Соединение ="Driver={Microsoft Visual FoxPro Driver};
                |SourceType=DBF;
                |SourceDB="+Путь+";
                |Exclusive=No;
                |Collate=Machine;
                |NULL=NO;
                |DELETED=NO;
                |BACKGROUNDFETCH=NO";
    
Ругается, мол нет такого драйвера
26 Ёпрст
 
11.08.21
14:21
(13) в дбф навигаторе есть кнопка dos  и он кажет "правильно"
27 Ёпрст
 
11.08.21
14:31
ну и кидай своё файло и свой текс запроса с инсертом. с файла можешь выкинуть все записи
28 DimaDmitriy
 
11.08.21
15:12
Заработало!

Я сделал две вещи:

- был установлен драйвер фокса версии 9, поставил ещё и 8
- в строке соединения я передавал путь до каталога, где лежат DBF
(думал, что это не важно, т.к. в команде insert указывается имя таблицы)
в итоге стал передавать путь напрямую к файлу DBF

Что из этого сработало - не знаю, но экспериментировать сейчас не хочу, ибо за два дня мозги изрядно поплавились)

Всем спасибо за участие!
29 DimaDmitriy
 
11.08.21
15:18
Проверил всё-таки: виноват был драйвер
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.