Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Некорректная кодировка после выполнения первой записи VFPOLEDB

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

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

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

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

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


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.