Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для ndrnesterov
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107

DBF to FireBird

15.01.2020, 11:07. Показов 2197. Ответов 5

Студворк — интернет-сервис помощи студентам
Добрый день!

Появилась задача записать все города всех регионов страны в таблицу Firebord. База данных ФИАС в формате DBF. Вес файла чуть больше 1 Гб. Конвертацию нужно реализовать только программно.

Я пока сделал так:

Кликните здесь для просмотра всего текста
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
string connStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path.Substring(0, path.LastIndexOf("\\")) + ";Extended Properties=dBASE IV;";
string stringCon_FB = @"data source = localhost; port = 3050; initial catalog = D:\DB_TEST.FDB; user id = SYSDBA; password = *****; Dialect = 3";
                    
DataTable temp = new DataTable();
DateTime date_now = DateTime.Now; // Для отсеивания неактуальных данных
 
OleDbConnection conn = new OleDbConnection(connStr);
conn.Open();
 
FbConnection conn_FB = new FbConnection(stringCon_FB);
conn_FB.Open();
 
OleDbDataAdapter da = new OleDbDataAdapter("SELECT REGIONCODE, AREACODE, CITYCODE, OFFNAME, SHORTNAME FROM " + path.Substring(0, path.IndexOf(".")) + " WHERE ENDDATE>= #" + date_now.Day + "/" + date_now.Month + "/" + date_now.Year + "# AND AOLEVEL = 4", conn);
DataSet ds = new DataSet();
da.Fill(ds);
temp = ds.Tables[0];
 
FbTransaction transaction = conn_FB.BeginTransaction();
FbCommand cmd = conn_FB.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = "create table fias_city (REGIONCODE INTEGER, AREACODE INTEGER, CITYCODE INTEGER, OFFNAME VARCHAR (50) NOT NULL, SHORTNAME VARCHAR(10) NOT NULL);";
cmd.ExecuteNonQuery();
transaction.Commit();
 
transaction = conn_FB.BeginTransaction();
cmd = conn_FB.CreateCommand();
cmd.Transaction = transaction;
foreach (DataRow row in temp.Rows)
{
                cmd.CommandText = "insert into " +
                    "fias_city " +
                    "values (" +
                    row["REGIONCODE"].ToString() + "," +
                    row["AREACODE"].ToString() + "," +
                    row["CITYCODE"].ToString() + ",'" +
                    row["OFFNAME"].ToString() + "','" +
                    row["SHORTNAME"].ToString() + "'" +
                    ");";
                cmd.ExecuteNonQuery();
}
transaction.Commit();
temp.Clear();
 
conn_FB.Close();
conn.Close();


И это временное решение, и его нельзя использовать, т.к. я трачу очень много памяти, и это очень долго работает...

Можно ли как-то обойти загрузку DBF файла в DataSet? Как этот процесс можно сделать не ресурсоемким?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2020, 11:07
Ответы с готовыми решениями:

Ошибка при загрузке DBF файлов с датой 'dd.mm.yy' (DBF FoxPro, TADOQvery, DataSource, DBGrid)
Возьмем для примера текущую дату - '04.09.2003'. В результате выполнения этого запроса данные сохраняются. Но если в системных настройках...

Копирование данных из одной таблицы dbf в шаблон dbf
Есть источник файл med.dbf с данными, необходимо перенести часть данных в файл-шаблон med.dbf. Особенность заключается в том, что в файле...

FireBird + Interbase&Firebird Development Studio
Установил FireBird 2.5 SuperClassic и Interbase&Firebird Development Studio. Зашел в студию, создал таблицу, пытаюсь создать БД - выдает...

5
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
15.01.2020, 12:19
.. может быть через внешний файл (CSV или какой там получается) ...?

Firebird: bulk insert and bulk export
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
15.01.2020, 12:32
ndrnesterov, мне кажется, или вы уже поднимали этот вопрос? И вам, вроде как, уже порекомендовали переносить данные порциями по 50-100 записей. Тогда объёмы потребляемой памяти будут фиксированны.
0
 Аватар для ndrnesterov
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
15.01.2020, 12:52  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
мне кажется, или вы уже поднимали этот вопрос?
Да... Но там была немного другая суть проблемы... Тут я хочу узнать, как можно сократить потребления ресурсов. Можно ли как-то обойти DataSet.

На счет порций - согласен) Но такая схема не сокращает время работы программы..

Добавлено через 1 минуту
Цитата Сообщение от carrotik Посмотреть сообщение
может быть через внешний файл (CSV или какой там получается)
Очень интересная идея) Уже пробую так делать...
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,946
15.01.2020, 12:54
Цитата Сообщение от ndrnesterov Посмотреть сообщение
Тут я хочу узнать, как можно сократить потребления ресурсов.
Я уже обозначил: выгребать и вставлять данные порциями. Тогда памяти много занято не будет. А значит и чистить её GC будет проще.

Цитата Сообщение от ndrnesterov Посмотреть сообщение
Но такая схема не сокращает время работы программы..
А что, так долго идёт перенос? Он однократный? Если да, то какая разница сколько он длится? Если нет, то вы заново всё каждый рас переносите, чтоли?

Чтобы ускорить, надо определить, что тормозит, источник при выгребании или Firebird при приёме. На данный момент выглядит, что вы ВСЁ вытаскиваете в оперативку. В такой ситуации даже калькулятор тормозить на фоне будет. Сначала поменяйте подход и переносите данные порциями. Если всё ещё долго будет, то можно рассмотреть вариант распараллеливания.
1
 Аватар для ndrnesterov
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
15.01.2020, 12:58  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
На данный момент выглядит, что вы ВСЁ вытаскиваете в оперативку. В такой ситуации даже калькулятор тормозить на фоне будет. Сначала поменяйте подход и переносите данные порциями. Если всё ещё долго будет, то можно рассмотреть вариант распараллеливания.
Да, вы правы... Сейчас займусь исправлением
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2020, 12:58
Помогаю со студенческими работами здесь

Работа с dbf в C# - вывести содержимое dbf в dataGridView
Необходимо вывести содержимое dbf в dataGridView, подскажите как сделать.... Заранее спасибо....

Разбиение строки в FireBird - Firebird/InterBase
Продолжая тему отсюда: https://www.cyberforum.ru/firebird/thread309236.html :wall: Есть поле типа VARCHAR, в котором хранятся данные вида...

Конвертирование файлов DBF III в DBF IV
Существует некая форма, которая подключается к dbf файлам и берет из них данные. строка подключения такая: ConnP.ConnectionString =...

Как подключить базу данных созданную в DBF Navigator с форматом ".dbf" к приложению на Lazarus?
1) Обязательно ли эти БД хранить ТОЛЬКО на диске C 2) Дайте полный алгоритм подключения их к проекту. Вот есть форма что на неё...

Как "доказать" Delphi, что файл с расширением не DBF - все таки dbf
Добрый день, коллеги-сокнопочники! Бьюсь-ломлюсь в открытую дверь (как мне кажется). Есть файл с именем *.0ew или *.1t6, но на самом...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
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/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru