С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28

Импорт DBF в MySQL через MySqlBulkLoader

15.02.2019, 23:24. Показов 2439. Ответов 8

Студворк — интернет-сервис помощи студентам
Добрый день, форумчане. Мало опыта в программировании, но пытаюсь написать программу, которая импортирует файл .dbf в MySQL базу.
Вся проблема в том, что файл такой не один, поэтому хочу в дальнейшем автоматизировать процесс.
Везде нахожу примеры "dbf в MS SQL" либо "csv в MySQL"
Для MS SQL используют SqlBulkCopy считывают файл и сразу льют его в базу.
Для MySQL может использоваться MySqlBulkLoader(Напр. при загрузке csv) либо LOAD DATA INFILE
Взял пример, где люьт из DBF в MSSQL, по идее всё прокатывает, но не знаю как передать dir.FullName и FieldIndex (см. ниже) в метод Load() (в MSSQL это был метод WriteToServer).
В студии в NuGet нашел библиотеки, которые читают dbf, и пишут базу в MSSQL, а вот примеров с ними для MySQL не нашёл.
Если кто сталкивался, помогите, заранее спасибо.
P.S. Также искал массовый конвертер dbf в txt (чтобы сделать импорт всех файлов через LOAD DATA INFILE) но бесплатных не нашёл


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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
class ImportDBF
    {
        
        public class BDFBulkReader : IDataReader
        {
            
 
 
            System.IO.FileStream FS;
            byte[] buffer;
            int _FieldCount;
            int FieldsLength;
            System.Globalization.DateTimeFormatInfo dfi = new System.Globalization.CultureInfo("en-US", false).DateTimeFormat;
            System.Globalization.NumberFormatInfo nfi = new System.Globalization.CultureInfo("en-US", false).NumberFormat;
            string[] FieldName;
            string[] FieldType;
            byte[] FieldSize;
            byte[] FieldDigs;
            int RowsCount;
            int ReadedRow = 0;
            Dictionary<string, object> R = new Dictionary<string, object>();
            Dictionary<int, string> FieldIndex = new Dictionary<int, string>();
 
            #region 
            public void Dispose() { FS.Close(); }
            public int Depth { get { return -1; } }
            public bool IsClosed { get { return false; } }
            public Object this[int i] { get { return new object(); } }
            public Object this[string name] { get { return new object(); } }
            public int RecordsAffected { get { return -1; } }
 
            
 
            public void Close() { }
            public bool NextResult() { return true; }
            public bool IsDBNull(int i) { return false; }
            public string GetString(int i) { return ""; }
            public DataTable GetSchemaTable() { return null; }
            public int GetOrdinal(string name) { return -1; }
            public string GetName(int i) { return ""; }
            public long GetInt64(int i) { return -1; }
            public int GetInt32(int i) { return -1; }
            public short GetInt16(int i) { return -1; }
            public Guid GetGuid(int i) { return new Guid(); }
            public float GetFloat(int i) { return -1; }
            public Type GetFieldType(int i) { return typeof(string); }
            public double GetDouble(int i) { return -1; }
            public decimal GetDecimal(int i) { return -1; }
            public DateTime GetDateTime(int i) { return new DateTime(); }
            public string GetDataTypeName(int i) { return ""; }
            public IDataReader GetData(int i) { return this; }
            public long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) { return -1; }
            public char GetChar(int i) { return ' '; }
            public long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) { return -1; }
            public byte GetByte(int i) { return 0x00; }
            public bool GetBoolean(int i) { return false; }
            public int GetValues(Object[] values) { return -1; }
 
            #endregion
 
            void SaveToTable(FileInfo dir, string TableName, string connestionString, Dictionary<int, string> FieldIndex)
            {
 
                string connectionString = "Server =localhost; Uid=administrator; Pwd=251130; persistsecurityinfo=True; SslMode=none; Allow User Variables=True";
                MySqlConnection conn = new MySqlConnection(connectionString);
                var loader = new MySqlBulkLoader(conn)
                {
                    TableName = TableName,
                    Timeout = 9999,
                    Load(new BDFBulkReader(dir.FullName, FieldIndex)) //пытался сделать по аналогии с SqlBulkCopy 
                }
            }
 
 
            //такая была функция для MS SQL
            /*
            void SaveToTable(FileInfo dir, string TableName, string connestionString, Dictionary<int, string> FieldIndex)
            {
                using (var loader = new SqlBulkCopy(connestionString, SqlBulkCopyOptions.Default))
                {
                    loader.DestinationTableName = TableName;
                    loader.BulkCopyTimeout = 9999;
                    loader.WriteToServer(new BDFBulkReader(dir.FullName, FieldIndex));
                }
            }*/
 
 
 
            public object GetValue(int i)
            {
                return R[FieldIndex[i]];
            }
 
 
            public BDFBulkReader(string FileName, Dictionary<int, string> FieldIndex)
            {
                FS = new System.IO.FileStream(FileName, System.IO.FileMode.Open);
                buffer = new byte[4];
                FS.Position = 4; FS.Read(buffer, 0, buffer.Length);
                RowsCount = buffer[0] + (buffer[1] * 0x100) + (buffer[2] * 0x10000) + (buffer[3] * 0x1000000);
                buffer = new byte[2];
                FS.Position = 8; FS.Read(buffer, 0, buffer.Length);
                _FieldCount = (((buffer[0] + (buffer[1] * 0x100)) - 1) / 32) - 1;
                FieldName = new string[_FieldCount];
                FieldType = new string[_FieldCount];
                FieldSize = new byte[_FieldCount];
                FieldDigs = new byte[_FieldCount];
                buffer = new byte[32 * _FieldCount];
                FS.Position = 32; FS.Read(buffer, 0, buffer.Length);
                FieldsLength = 0;
                for (int i = 0; i < _FieldCount; i++)
                {
                    FieldName[i] = System.Text.Encoding.Default.GetString(buffer, i * 32, 10).TrimEnd(new char[] { (char)0x00 });
                    FieldType[i] = "" + (char)buffer[i * 32 + 11];
                    FieldSize[i] = buffer[i * 32 + 16];
                    FieldDigs[i] = buffer[i * 32 + 17];
                    FieldsLength = FieldsLength + FieldSize[i];
                }
                FS.ReadByte();
 
                this.FieldIndex = FieldIndex;
 
                FieldIndex.Add(0, "POSTALCODE");
                FieldIndex.Add(1, "IFNSFL");
                FieldIndex.Add(2, "TERRIFNSFL");
                FieldIndex.Add(3, "IFNSUL");
                FieldIndex.Add(4, "TERRIFNSUL");
                FieldIndex.Add(5, "OKATO");
                FieldIndex.Add(6, "OKTMO");
                FieldIndex.Add(7, "UPDATEDATE");
                FieldIndex.Add(8, "HOUSENUM");
                FieldIndex.Add(9, "ESTSTATUS");
                FieldIndex.Add(10, "BUILDNUM");
                FieldIndex.Add(11, "STRUCNUM");
                FieldIndex.Add(12, "STRSTATUS");
                FieldIndex.Add(13, "HOUSEID");
                FieldIndex.Add(14, "HOUSEGUID");
                FieldIndex.Add(15, "AOGUID");
                FieldIndex.Add(16, "STARTDATE");
                FieldIndex.Add(17, "ENDDATE");
                FieldIndex.Add(18, "STATSTATUS");
                FieldIndex.Add(19, "NORMDOC");
                FieldIndex.Add(20, "COUNTER");
            }
 
            public bool Read()
            {
                if (ReadedRow >= RowsCount) return false;
 
                R.Clear();
                buffer = new byte[FieldsLength];
                FS.ReadByte();
                FS.Read(buffer, 0, buffer.Length);
                int Index = 0;
                for (int i = 0; i < FieldCount; i++)
                {
                    string l = System.Text.Encoding.GetEncoding(866).GetString(buffer, Index, FieldSize[i]).TrimEnd(new char[] { (char)0x00 }).TrimEnd(new char[] { (char)0x20 });
                    Index = Index + FieldSize[i];
                    object Tr;
                    if (l.Trim() != "")
                    {
                        switch (FieldType[i])
                        {
                            case "L": Tr = l == "T" ? true : false; break;
                            case "D": Tr = DateTime.ParseExact(l, "yyyyMMdd", dfi); break;
                            case "N":
                                {
                                    if (FieldDigs[i] == 0)
                                        Tr = int.Parse(l, nfi);
                                    else
                                        Tr = decimal.Parse(l, nfi);
                                    break;
                                }
                            case "F": Tr = double.Parse(l, nfi); break;
                            default: Tr = l; break;
                        }
 
                    }
                    else
                    {
                        Tr = DBNull.Value;
                    }
                    R.Add(FieldName[i], Tr);
                }
                ReadedRow++;
                return true;
            }
 
            public int FieldCount
            {
                get { return _FieldCount; }
            }
 
        }
 
 
 
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.02.2019, 23:24
Ответы с готовыми решениями:

Импорт из Excel на .dbf через запрос Insert
Мне нужно импортировать таблицу из Excel файла на .dbf (Clipper). Я написал примерную программу, которая из Excel через запрос сожает...

Импорт из Excel в dbf
Как на VBA сделать импорт (выборочных) данных в DBF ? Нравится как это реализовано в 1с. Хотелось бы наподобии 1) Создать файл в...

Импорт dbf в dbgrid
добрый день. имеется следующий код, ADOQuery1.SQL.Clear; ADOQuery1.SQL.Add('SELECT * FROM 5299Ì2201.dbf'); ADOQuery1.Active:=True; ...

8
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
16.02.2019, 10:04
Цитата Сообщение от prostospirit Посмотреть сообщение
Везде нахожу примеры "dbf в MS SQL" либо "csv в MySQL"
Из "dbf в MS SQL"вы узнаете, как считать dbf в DataSet. Потом из DataSet делаете csv файл и переходите к "csv в MySQL".
Создание csv-файла из DataSet: https://stackoverflow.com/ques... a-csv-file
1
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
16.02.2019, 12:35  [ТС]
Цитата Сообщение от Igr_ok Посмотреть сообщение
Из "dbf в MS SQL"вы узнаете, как считать dbf в DataSet. Потом из DataSet делаете csv файл и переходите к "csv в MySQL".
Создание csv-файла из DataSet: https://stackoverflow.com/ques... a-csv-file
У меня в DBF содержит в полях запятые, а у csv запятая используется в качестве разделителя. Я так понимаю, что надо перегонять в txt или dat формат с табуляцией в качестве разделителя полей
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
16.02.2019, 14:19
prostospirit, разделителем может быть и другой символ.Обычно достаточно ; или |. В "тяжелых" случаях я использовал ~.
0
 Аватар для XIST
1960 / 1069 / 148
Регистрация: 01.10.2009
Сообщений: 3,590
Записей в блоге: 1
16.02.2019, 15:47
Цитата Сообщение от Igr_ok Посмотреть сообщение
Из "dbf в MS SQL"вы узнаете, как считать dbf в DataSet. Потом из DataSet делаете csv файл и переходите к "csv в MySQL".
Создание csv-файла из DataSet: https://stackoverflow.com/ques... a-csv-file
Господи, а зачем такой изврат?
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
16.02.2019, 17:54  [ТС]
Цитата Сообщение от XIST Посмотреть сообщение
Господи, а зачем такой изврат?
А есть ещё предложение?
0
 Аватар для XIST
1960 / 1069 / 148
Регистрация: 01.10.2009
Сообщений: 3,590
Записей в блоге: 1
16.02.2019, 17:58
это был вопрос, а не предложение.
Хотите предложение:вставлять из DBF в MySQL напрямую. А что выше, это просто нет слов. Еще задействуйте ворд для передачи данных междлу двумя СУБД
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
16.02.2019, 18:19  [ТС]
Цитата Сообщение от XIST Посмотреть сообщение
это был вопрос, а не предложение.
Хотите предложение:вставлять из DBF в MySQL напрямую. А что выше, это просто нет слов. Еще задействуйте ворд для передачи данных междлу двумя СУБД
Так я и ищу способ вставить напрямую из DBF в MySQL, но подобных решений в интернете я не вижу, только под MS SQL
0
0 / 0 / 0
Регистрация: 19.11.2015
Сообщений: 28
18.02.2019, 21:08  [ТС]
В общем, было принято такое решение
Получаем данные, как описано тут:
https://stackoverflow.com/ques... -datatable

Из DataTable без выгрузки в иные файлы просто пишем в MySQL базу, используя этот метод:
https://randomlol.de/2014/05/2... -to-mysql/

после загрузки сразу чистим DataTable

14000 строк (28 мб) льётся примерно 10 секунд.

Есть вариант прямого доступа к файлу DBF, но в итоге всё равно залитие через DataTable:
http://www.sql.ru/forum/664774... 56#7194256
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2019, 21:08
Помогаю со студенческими работами здесь

Импорт DBF в Oracle
Коллеги, добрый день. Есть следующая задача: создать клиент, который будет переодически грузить DBF-файл (КЛАДР), с определенного...

Импорт DBF файла
Ребята как мне импортировать DBF файл в Oracle9i Data Base, или где мне найти документацию по этой теме?

Импорт из dbf файла
имеется dbf файл reg.dbf, из него необходимо извлечь данные и поместить в таблицу sql думаю делать по след. схеме: 1. открыть...

Импорт .dbf в PostgreSQL. C#
Здравствуйте. Возникла задача импорта dbf файла в базу данных Postgre... нашла всего несколько вопросв по данной теме в частности...

Импорт Данных из dbf в DBGrid
Всем добрый день! Необходимо по работе написать приложение для выгрузки данных из dbf. Никогда не имел дело с базами данных - поэтому много...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru