powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VS C# dbf + кодировка
12 сообщений из 12, страница 1 из 1
VS C# dbf + кодировка
    #39335402
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Помогите плиз.
Нужно изменить Code Page в DBF таблице программно из C#.
Ничего полезного не нашел:
Код: c#
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.
64.
65.
66.
67.
68.
69.
70.
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE 5.0;Data Source=" + filePath;
            //con.ConnectionString = @"Provider=VFPOLEDB.1;Data Source=" + filePath + ";Mode=ReadWrite;Collating Sequence=RUSSIAN";
            con.Open();

            // configure column name and type
            string columnSet = "";
            string colTypeVar = "";
            foreach (struct1 s in VectorList1)
            {
                switch (s.ColumnType)
                {
                    case "System.String":
                        colTypeVar = " Char (140)";
                        break;
                    case "System.DBNull":
                        colTypeVar = " Char (140)";
                        break;
                    case "System.Double":
                        colTypeVar = " Numeric";
                        break;
                }
                if (columnSet == "")
                //{ columnSet = ".dbf ('" + s.ColumnName + "'" + colTypeVar; }
                { columnSet = " ('" + s.ColumnName + "'" + colTypeVar; }
                else
                { columnSet = columnSet + ", '" + s.ColumnName + "'" + colTypeVar; }
            }

            // Creating clients.dbf table 
            createTable = null;
            bool cycleFlag = false;
            do
            {
                try
                {
                    createTable = con.CreateCommand();
                    fileName = fileName.Replace("_", "").Replace("-", "").Replace(" ", "");
                    createTable.CommandText = "CREATE TABLE " + fileName + columnSet + ");";
                    Console.WriteLine(createTable.CommandText);
                    createTable.ExecuteNonQuery();
                    createTable.Dispose();
                    break;
                }
                catch (OleDbException ie)
                {
                    string message = "Файл с таким названием уже существует, удалите файл и повторите снова нажав \"Да\".";
                    message = message + System.Environment.NewLine + "Нажав \"Нет\" вы дополните существующий файл (Не рекомендуется).";
                    string caption = "Исключение";
                    var result = MessageBox.Show(message, caption,
                                                 MessageBoxButtons.YesNo,
                                                 MessageBoxIcon.Question);
                    // If the no button was pressed ...
                    if (result.ToString() == "Yes")
                    {
                        cycleFlag = true;
                    }
                    else
                    {
                        break;
                    }
                }
            } while (cycleFlag);

            // Change code page to 866
            //changeCodePage = con.ChangeDatabase();
            changeCodePage = con.CreateCommand();
            changeCodePage.CommandText = "DO Cpzero WITH '" + fileName + ".DBF',866";
            changeCodePage.ExecuteNonQuery();
            changeCodePage.Dispose();



в последнем возникает ошибка:
Код: c#
1.
2.
3.
Необработанное исключение типа "System.Data.OleDb.OleDbException" в System.Data.dll

Дополнительные сведения: Ошибочная инструкция SQL; предполагалось 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT' или 'UPDATE'.
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335405
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интуитивно я понимаю, что последняя это DDL команда.
Возможно такие команды делать как то по другому.
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335430
Agapov_stas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokИнтуитивно я понимаю, что последняя это DDL команда.
Возможно такие команды делать как то по другому.
Так посмотрите что Вы выполняете. Скорее всего "слепили" неверно.
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335471
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Agapov_stasvadipokИнтуитивно я понимаю, что последняя это DDL команда.
Возможно такие команды делать как то по другому.
Так посмотрите что Вы выполняете. Скорее всего "слепили" неверно.

Код: c#
1.
2.
3.
4.
5.
6.
7.
            // Change code page to 866
            //changeCodePage = con.ChangeDatabase();
            changeCodePage = con.CreateCommand();
            changeCodePage.CommandText = "DO Cpzero WITH " + fileName + ".DBF,866;";
            Console.WriteLine(changeCodePage.CommandText);
            changeCodePage.ExecuteNonQuery();
            changeCodePage.Dispose();



Код: c#
1.
2.
CREATE TABLE Fondy1999 ('NSKV' Char (140), 'plos' Char (140), 'region' Char (140), 'prim' Numeric, 'filename' Char (140), 'size' Char (140));
DO Cpzero WITH Fondy1999.DBF,866;



Да не, вроде все в порядке.
Скорее всего последнею команду надо выполнять по другому.
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335479
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokДа не, вроде все в порядке.
Скорее всего последнею команду надо выполнять по другому.
Скорее всего она из FoxPro?
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335498
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВvadipokДа не, вроде все в порядке.
Скорее всего последнею команду надо выполнять по другому.
Скорее всего она из FoxPro?

Да вроде, просто я все уже перепробовал. И поэтому начал такие странные эксперименты делать.
Уже не помню где его отрыл.
Основной вопрос такой, как поменять Code Page программно из С#?
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335537
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"DO Cpzero" это даже не команда фокса, а Cpzero.prg, исходник, который вместе с фоксом идет. В VFPOLEDB его нет. Microsoft.Jet.OLEDB вообще понятия не имеет что это.

Открывай DBF файловыми средствами и меняй 29й байт. Структура DBF
Значение Кодировка101 (0x65) 866 Russian MS-DOS201 (0xC9) 1251 Russian Windows
"DO Cpzero" это и делает.

Только учти что для Microsoft.Jet.OLEDB.4.0 глубоко пофиг на то что ты там напишешь, будет читать все как 866.
VFPOLEDB учтет. А если в 29 байте будет 0, то будет читать как 1251 (кодировка по умолчанию).
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335541
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokОсновной вопрос такой, как поменять Code Page программно из С#?
Исходная и конечная кодовые страницы какие?
Чем будет читаться файл?
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335576
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T"DO Cpzero" это даже не команда фокса, а Cpzero.prg, исходник, который вместе с фоксом идет. В VFPOLEDB его нет. Microsoft.Jet.OLEDB вообще понятия не имеет что это.

Открывай DBF файловыми средствами и меняй 29й байт. Структура DBF
Значение Кодировка101 (0x65) 866 Russian MS-DOS201 (0xC9) 1251 Russian Windows
"DO Cpzero" это и делает.

Только учти что для Microsoft.Jet.OLEDB.4.0 глубоко пофиг на то что ты там напишешь, будет читать все как 866.
VFPOLEDB учтет. А если в 29 байте будет 0, то будет читать как 1251 (кодировка по умолчанию).

Спасибо! В ручную поменять я умею с этим нет проблем.
Программ пишется веть для народу, им нужен готовый продукт.
Надо поменять на DOS(866). Чтобы FoxPro правильно отображала русские буквы.
У меня стоит FoxPro 9.0.
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335579
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TvadipokОсновной вопрос такой, как поменять Code Page программно из С#?
Исходная и конечная кодовые страницы какие?
Чем будет читаться файл?
Исходная Excel.
Открывается в DataGrid, буквы там корректные.
После создания таблицы dbf и инсерта буквы становятся корявыми пока не поменяешь на MS-DOS(866).
Подозреваю, что в конечном dbf кодировка вообще не проставляется, т. к. при открытии файла в FoxPro вылетает окошко с предложением выбрать Code Page.
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335590
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vadipokНадо поменять на DOS(866). Чтобы FoxPro правильно отображала русские буквы.
Код: c#
1.
2.
3.
4.
			using (var fs = new FileStream("My.dbf", FileMode.Open)) {
				fs.Position = 29;
				fs.WriteByte(101);
			}
...
Рейтинг: 0 / 0
VS C# dbf + кодировка
    #39335629
vadipok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TvadipokНадо поменять на DOS(866). Чтобы FoxPro правильно отображала русские буквы.
Код: c#
1.
2.
3.
4.
			using (var fs = new FileStream("My.dbf", FileMode.Open)) {
				fs.Position = 29;
				fs.WriteByte(101);
			}



Спасибо большое!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / VS C# dbf + кодировка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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