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

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

15.02.2019, 23:24. Показов 2473. Ответов 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 / 1070 / 148
Регистрация: 01.10.2009
Сообщений: 3,593
Записей в блоге: 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 / 1070 / 148
Регистрация: 01.10.2009
Сообщений: 3,593
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru