powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DBF. oem/ansi converter
25 сообщений из 51, страница 2 из 3
DBF. oem/ansi converter
    #34639458
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас тут форум или презентация Гугла?
:(

Спасибо.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34639509
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну можно и в яндексе поискать... без разницы. Суть в том что если набрать в поисковике предложеное мной словосочетание то в ссылках напервой же странице ты найдешь очень много разнообразной информации о структуре DBF таблиц. Почитаешь, переваришь. Попробуешь что-то сам... поэкспериментируешь. Или мне за тебя поискать и тебе ссылки выложить???
С уважением, Николай.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34639758
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjcСоздавал таблички при помощи DAO и Create Table.
в 29 байте был 0.... :(

Ну и? По умолчанию - OEM кодировка. Выставь данный байтик ручками. Может можно одним из параметров соединения задавать, но не гарантирую ибо не задавался целью проверить.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34639902
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот и нет. У меня по умолчанию почему-то всегда получалась DOS. Параметры соединения почем-то игнорировались. А вот ручками выставлять байтики мне было не с руки потому как проверить 200-300 файлов в день автоматически, а потом залезть в них и ручками поправить 29 байт... Попахивает извращением. :)
Хотя теперь вот думаю, а если при записи данных в файл конвертить строки при помощи CharToOem... может что и получится :)
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34639924
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне структура DBF файла как-то не нужна.
И 29-й байт у меня ни на что не влияет.
Меня интересовала строка подключения через DAO, когда таблица присоединяется с ANSI-кодировкой.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34639974
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чур без обид.... :)
Поиск по форуму
"DAO", "OpenDatabase" "Openrecordset"

OpenDatabase(MainPath, False, False, "dBASE IV;LANGID=0x0419;CP=866;COUNTRY=0")
Вот эта строка подключается к базе dbf при этом используется кодовая страница DOS 866.
Особо обрати внимание на то что под базой понимается ПАПКА в которой лежат твои таблицы.
Длина имени таблицы не должна превышать 8 символов и называться латинскими буквами (об этом я уже писал.)

Читай, смотри если где будут затыки в коде попробуем разобраться вместе. :)

С уважением, Николай.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34640932
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага.
Вот это уже дело.
Теперь бы подключиться с виндовой кодировкой.
Параметр CP=1251 - не прокатил, ни на что не повлиял.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641197
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что вообще тебе нужно сделать с этими DBF??
С уважением, Николай.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641373
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присоединить к аккессу и поработать с ним.
Вооот.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641446
Фотография klen_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
DoCmd.TransferDatabase acLink, "dBase III", только_путь, acTable, "sc16.dbf", "имя_Таблицы_в_Access-е"
это Link к базе mdb
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641504
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, спорщики...

Держите код создающий две разные таблички в кодировках OEM

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Option Explicit

Public Sub Main()
    Dim cn As New ADODB.Connection
    Dim s As String, sPath As String
    
    sPath = App.Path & "\TestDBFs\"
    On Error GoTo Err_
    If Len(Dir(sPath, vbDirectory)) =  0  Then MkDir sPath
    On Error Resume Next
    s = Dir$(App.Path & "\DBF\*.dbf")
    Do While Len(s)
        Kill App.Path & "\DBF\" & s
        s = Dir$
    Loop
    On Error GoTo Err_
    
    Set cn = New ADODB.Connection
    cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cn.Open "Data Source=" & sPath & ";Extended Properties=dBASE IV"
    ' OEM
    cn.Execute "CREATE TABLE tbOEM (t TEXT(50))"
    cn.Execute "INSERT INTO tbOEM (t) VALUES ('Проверочка OEM')"
    
    ' ANSII
    cn.Execute "CREATE TABLE tbANSII (t TEXT(50))"
    If ChangeDbfCodePageToANSII(sPath & "tbANSII.DBF") Then
        cn.Execute "INSERT INTO tbANSII (t) VALUES ('Проверочка ANSII')"
    End If
    cn.Close
    Exit Sub

Err_:
    With cn.Errors
        If .Count Then
            With .Item( 0 )
                If .NativeError = - 329323426  And .Number = - 2147467259  Then Resume
            End With
        End If
    End With
    MsgBox Err.Description, vbCritical
End Sub

Public Function ChangeDbfCodePageToANSII(sDbfPath As String) As Boolean
    Dim iHFile As Integer, s As String, b As Byte
    
    On Error GoTo Err_
    iHFile = FreeFile
    Open sDbfPath For Binary Access Read Write Lock Read Write As #iHFile
    Seek #iHFile,  30 
    Get #iHFile, , b
    If b <>  87  Then
        Seek #iHFile,  30 
        Put #iHFile, , CByte( 87 )
    End If
    Close #iHFile: iHFile =  0 
    ChangeDbfCodePageToANSII = True
    Exit Function
    
Err_:
    s = Err.Description
    If iHFile Then Close #iHFile: iHFile =  0 
    MsgBox s, vbCritical
End Function
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641510
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFЭх, спорщики...

Держите код создающий две разные таблички в кодировках OEM и ANSII и пишущий в них строку данных. Любая из этих табличек правильно откроется в том-же Access...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Option Explicit

Public Sub Main()
    Dim cn As New ADODB.Connection
    Dim s As String, sPath As String
    
    sPath = App.Path & "\TestDBFs\"
    On Error GoTo Err_
    If Len(Dir(sPath, vbDirectory)) =  0  Then MkDir sPath
    On Error Resume Next
    s = Dir$(App.Path & "\DBF\*.dbf")
    Do While Len(s)
        Kill App.Path & "\DBF\" & s
        s = Dir$
    Loop
    On Error GoTo Err_
    
    Set cn = New ADODB.Connection
    cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cn.Open "Data Source=" & sPath & ";Extended Properties=dBASE IV"
    ' OEM
    cn.Execute "CREATE TABLE tbOEM (t TEXT(50))"
    cn.Execute "INSERT INTO tbOEM (t) VALUES ('Проверочка OEM')"
    
    ' ANSII
    cn.Execute "CREATE TABLE tbANSII (t TEXT(50))"
    If ChangeDbfCodePageToANSII(sPath & "tbANSII.DBF") Then
        cn.Execute "INSERT INTO tbANSII (t) VALUES ('Проверочка ANSII')"
    End If
    cn.Close
    Exit Sub

Err_:
    With cn.Errors
        If .Count Then
            With .Item( 0 )
                If .NativeError = - 329323426  And .Number = - 2147467259  Then Resume
            End With
        End If
    End With
    MsgBox Err.Description, vbCritical
End Sub

Public Function ChangeDbfCodePageToANSII(sDbfPath As String) As Boolean
    Dim iHFile As Integer, s As String, b As Byte
    
    On Error GoTo Err_
    iHFile = FreeFile
    Open sDbfPath For Binary Access Read Write Lock Read Write As #iHFile
    Seek #iHFile,  30 
    Get #iHFile, , b
    If b <>  87  Then
        Seek #iHFile,  30 
        Put #iHFile, , CByte( 87 )
    End If
    Close #iHFile: iHFile =  0 
    ChangeDbfCodePageToANSII = True
    Exit Function
    
Err_:
    s = Err.Description
    If iHFile Then Close #iHFile: iHFile =  0 
    MsgBox s, vbCritical
End Function
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641538
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть поправил:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Option Explicit

Public Sub Main()
    Dim cn As New ADODB.Connection
    Dim s As String, sPath As String
    
    sPath = App.Path & "\TestDBFs\"
    On Error GoTo Err_
    If Len(Dir(sPath, vbDirectory)) =  0  Then MkDir sPath
    On Error Resume Next
    s = Dir$(sPath & "*.dbf")
    Do While Len(s)
        Kill sPath & s
        s = Dir$
    Loop
    On Error GoTo Err_
    
    Set cn = New ADODB.Connection
    cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cn.Open "Data Source=" & sPath & ";Extended Properties=dBASE IV"
    ' OEM
    cn.Execute "CREATE TABLE tbOEM (t TEXT(50))"
    cn.Execute "INSERT INTO tbOEM (t) VALUES ('Проверочка OEM')"
    
    ' ANSII
    cn.Execute "CREATE TABLE tbANSII (t TEXT(50))"
    If ChangeDbfCodePageToANSII(sPath & "tbANSII.DBF") Then
        cn.Execute "INSERT INTO tbANSII (t) VALUES ('Проверочка ANSII')"
    End If
    cn.Close
    Exit Sub

Err_:
    With cn.Errors
        If .Count Then
            With .Item( 0 )
                If .NativeError = - 329323426  And .Number = - 2147467259  Then Resume
            End With
        End If
    End With
    MsgBox Err.Description, vbCritical
End Sub

Public Function ChangeDbfCodePageToANSII(sDbfPath As String) As Boolean
    Dim iHFile As Integer, s As String, b As Byte
    
    On Error GoTo Err_
    iHFile = FreeFile
    Open sDbfPath For Binary Access Read Write Lock Read Write As #iHFile
    Seek #iHFile,  30 
    Get #iHFile, , b
    If b <>  87  Then
        Seek #iHFile,  30 
        Put #iHFile, , CByte( 87 )
    End If
    Close #iHFile: iHFile =  0 
    ChangeDbfCodePageToANSII = True
    Exit Function
    
Err_:
    s = Err.Description
    If iHFile Then Close #iHFile: iHFile =  0 
    MsgBox s, vbCritical
End Function
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641603
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tbANSII.DBF содержится вместо информации куча знаков вопроса....
цитирую :)
?????????? ANSII
А oem читается нормально

С уважением, Николай.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641635
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjctbANSII.DBF содержится вместо информации куча знаков вопроса....
цитирую :)
?????????? ANSII
А oem читается нормально

Смотрим на скриншот во вложенном файле.

P.S Откуда я знаю чем у Вас читается...
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641779
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на какой версии ADO галочка стоит???
Ибо сделал все тоже самое.... содержимое tbANSII.DBF не читается :(
Вот эти версии ADO стоят у меня. Может заплатку какую привинтить???
С уважением, Николай.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641796
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смена бита по смещению 29 ничего не дает.
А обе таблицы читаются нормально, ибо в обеих записан ASCII русский текст.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641949
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Letter_DСмена бита по смещению 29 ничего не дает.
А обе таблицы читаются нормально, ибо в обеих записан ASCII русский текст.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34641972
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Letter_DСмена бита по смещению 29 ничего не дает.
А обе таблицы читаются нормально, ибо в обеих записан ASCII русский текст.

Вот мои таблички.
Посмотрев их даже тем-же FAR-ом можно явно увидеть что они записались в разных кодировках.
Попробуйте прилинковать любую из них в Access-e - увидите то что я присылал на скриншоте.
Любая из них нормально откроется и из кода.

Что-же я все-же не так делаю-то, что все работает без проблем??? И притом много лет.

Ибо про 29-ый байтик я узнал еще со времен FoxPro for Dos v2.5 - лет так ~15 назад...
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34642114
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не спорит с тобой, просто я пытаюсь понять почему у меня на протяжении 3-лет все попытки научится корректно работать с DBF таблицами в WIN кодировке заканчивались полным крахом. И даже сейчас когда ты дал готовый код у меня все равно ничего не получается. Мне вот что интересно. С какой версией ADO ты работаешь??? Скорее всего дело в этом... хотя.. хвост его знает. Сначала я обрадовался как слон думаю ну все.. мучения закончились.. есть красивый рабочий код, ан нет..

С уважением, Николай.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34642438
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gjghjcСначала я обрадовался как слон думаю ну все.. мучения закончились.. есть красивый рабочий код, ан нет...

Не все еще потеряно.

Значит так - приведенный выше код я набрасывал и проверял на рабочей машине (WinXP).
Дома он не пошел (Vista) - в табличку писались вопросики.

На скорую руку внес небольшие изменения:

Так создаем таблички, чтобы они создались в старом DOS-формате (впрочем тут все как и раньше):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
    Set cn = New ADODB.Connection
    cn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cn.Open "Data Source=""" & sPath & """;Extended Properties=dBASE IV"
    ' OEM
    cn.Execute "CREATE TABLE tbOEM (t CHAR(50))"
    ' ANSII
    cn.Execute "CREATE TABLE tbANSII (t TEXT(50))"
    ChangeDbfCodePageToANSII sPath & "tbANSII.DBF"

А вот через такой коннект с ними работаем дальше:

Код: plaintext
1.
2.
3.
4.
5.
6.
    Set cn = New ADODB.Connection
    cn.Provider = "VFPOLEDB.1"
    cn.Open "Data Source=""" & sPath & """;Collating Sequence=RUSSIAN"
    
    cn.Execute "INSERT INTO tbOEM (t) VALUES ('Проверочка OEM')"
    cn.Execute "INSERT INTO tbANSII (t) VALUES ('Проверочка ANSII')"

Так все заработало и дома.

------------
Что установлено на рабочей машине что там все работает без проблем я уж не помню - мне не столь часто приходится работать с Win-кодировкой в DBF-ках, чтобы на этом заостряться.
--
OLEDB-шного провайдера для FoxPro я брал здесь .
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34642585
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, попробую помучать этот код. :)

С уважением, Николай.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34643086
Letter_D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я посмотрел b FAR'ом и блокнотом - в обоих таблицах текст записался ANSI русской кодировкой.
У меня стоит XP и Office 2002.
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34643123
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Letter_DЯ посмотрел b FAR'ом и блокнотом - в обоих таблицах текст записался ANSI русской кодировкой. У меня стоит XP и Office 2002.

Последний пример (с FoxPro-шным провайдером) отлично отрабатывает на рабочей и домашней машине.
--------------

Вообще-же меня сейчас больше интересует вопрос - из-за чего возникает разница в работе с DBF-ками провайдера Microsoft.Jet.OLEDB.4.0 на разных машинах...
...
Рейтинг: 0 / 0
DBF. oem/ansi converter
    #34644659
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrFВообще-же меня сейчас больше интересует вопрос - из-за чего возникает разница в работе с DBF-ками провайдера Microsoft.Jet.OLEDB.4.0 на разных машинах...Разные кодировки по умолчанию на уровне системы.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / DBF. oem/ansi converter
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]