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

DBF to FireBird

15.01.2020, 11:07. Показов 2222. Ответов 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
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,435
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
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,435
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
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru