4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
|||||||||||
1 | |||||||||||
DataSet и Firebird23.12.2019, 13:45. Показов 2003. Ответов 23
Добрый день!
У меня вопрос с программным добавлением DBF в базу firebird. Обязательное условие - это должна быть программа на С#. Вообщем, я загружаю таблицу dbf в DataSet. Кликните здесь для просмотра всего текста
После я хочу из DataSet выгрузить эту таблицу в firebird. Есть ли легкий способ это сделать? Я начал писать код на костылях и палках, типа: Кликните здесь для просмотра всего текста
Потом ещё извращения с insert into... Но это как-то неправильно... Меня прям что-то останавливает... Кто-нибудь с таким сталкивался? Как можно реализовать перемещение таблицы из DataSet в firebird?
0
|
23.12.2019, 13:45 | |
Ответы с готовыми решениями:
23
Передача данных из таблицы одной dataSet в таблицу другой dataSet Отбор записей из одного DataSet в другой DataSet FireBird + Interbase&Firebird Development Studio Заполнение DataSet данными из другого DataSet |
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
23.12.2019, 14:01 | 2 |
.. так а что вы тут придумаете, разве что написать Stored Procedure в Firebird, и потом вызывать, но меньше ли кода будет, если параметры всегда разные ...
0
|
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
|
23.12.2019, 14:10 [ТС] | 3 |
Эх... Как же я хотел писать код коротко и красиво... Теперь придется собирать метод с матами в коде...
0
|
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
|
|
24.12.2019, 00:43 | 4 |
Некоторые участки кода можно значительно упростить, но общая идея не изменится-так или иначе нужен генератор sql для создания таблиц.
Insert лучше сделать через DataAdapter.
0
|
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
|
|
24.12.2019, 05:56 | 5 |
ndrnesterov, а всю эту кашу точно надо писать руками? Вы же полюбому знаете схему как DBF-базы, так и базы в Firebird, так ведь? И эту схему можно описать нормальными классами, а данные вытягивать\вставлять с помощью ORM типа Entity Framework или Linq2Db.
1
|
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
||||||
24.12.2019, 09:23 [ТС] | 6 | |||||
И так.. Вот что у меня получилось... На форму добавил progressBar, чтобы не волноваться, что все зависло и можно было мышкой подгонять процесс работы... Скидываю весь код:
Кликните здесь для просмотра всего текста
И это очень долго!! Базы имеют размеры (30Мб - 2Гб). Я оставил работать программу на всю ночь и в итоге оно даже половину не успело перенести... Добавлено через 1 минуту
0
|
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
|
|
24.12.2019, 10:49 | 7 |
0
|
800 / 583 / 207
Регистрация: 21.02.2019
Сообщений: 2,095
|
|
24.12.2019, 10:57 | 8 |
.. хм .. а Формы-то тут зачем? .. ну, чисто консольная же задача .. вообще на скриптах можно было бы .. .. или задача не в том, чтобы сделать, а чтобы по методичке?
0
|
Usaga
|
24.12.2019, 10:59
#9
|
0
|
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
|
24.12.2019, 11:06 [ТС] | 10 |
Верно) Они совершенно разные... Но радует, что типы данных только double, string и datetime...
Добавлено через 1 минуту Согласен, но форма нужна будет для дальнейшей работы... На форму в компоненты будут выгружаться некоторые данные, при взаимодействии с которыми, будут выполняться определенные работы)
0
|
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
|
|
24.12.2019, 11:29 | 11 |
Insert делать через DataAdapter, подключение создавать не на каждый чих, а единоразово или на batch. Создание отдельного подключения для каждой строки это то что больше всего бьет по производительности.
1
|
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
||||||
24.12.2019, 13:19 [ТС] | 12 | |||||
Ты волшебник
Сейчас упростил код по твоим советам и работа программы очень сильно ускорилась! Скорее всего в 2 и более раза быстрее! Посмотри, может ещё что-нибудь можно упростить? Кликните здесь для просмотра всего текста
Добавлено через 13 минут Ааа... Магия в том, что программа не записывает ничего))) Ищу, почему)
0
|
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
|
|
24.12.2019, 13:25 | 13 |
Начните с поиска команды на выполнение запроса с INSERT. Я вот её в упор не вижу.
1
|
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
||||||
24.12.2019, 13:30 [ТС] | 14 | |||||
Да... В insert я забыл прописать
0
|
12309 / 8672 / 1310
Регистрация: 21.01.2016
Сообщений: 32,600
|
|
24.12.2019, 13:42 | 15 |
ndrnesterov, запросы вставки оберните в одну транзакцию. Тогда скорость вставки увеличится существенно. Но журнал транзакций начнёт разбарабанивать. Если данных много, то такими транзакциями данные нужно разбивать на порции по 500-1000.
Ну и выполнять в отдельном потоке, чтобы окно не зависало. Или вообще выкинуть весь UI к чертям и оставить простое консольное приложение. Добавлено через 1 минуту В таком случае DataAdapter чуть более, чем бесполезен и его можно не создавать. Добавлено через 2 минуты И ещё: я что-то не увидал, как ваше приложение анализирует и воссоздаёт первичные и внешние ключи, а так же индексы. Это всё на фиг не нужно в вашей целевой базе? И почему строки в сто пятьдесят символов?
1
|
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
|
|
24.12.2019, 14:01 | 16 |
ndrnesterov, DataAdapter неправильно используете
Гляньте эту статью https://docs.microsoft.com/en-... taadapters Там и batch команды поддерживаются и все что хочешь)
1
|
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
|
24.12.2019, 14:02 [ТС] | 17 |
Подскажите, а как запросы вставки обернуть в одну транзакцию?
На счет ключей - я добавлю) Мне сначала нужно ускорить процесс добавления)
0
|
4 / 4 / 3
Регистрация: 28.11.2017
Сообщений: 107
|
||||||
24.12.2019, 14:31 [ТС] | 19 | |||||
Увидел) Только я не понимаю, что в моем случае прописывать в adapter.Update();
Добавлено через 2 минуты Спасибо за пример! Разобрался) Сейчас буду реализовывать insert пакетами по 1000 строк)) И после буду думать, что можно сделать с первичными и вторичными ключами... Вот код на данный момент: Кликните здесь для просмотра всего текста
0
|
1150 / 858 / 263
Регистрация: 30.04.2009
Сообщений: 3,598
|
|
24.12.2019, 14:40 | 20 |
ndrnesterov, это все не то
Попробуйте разобраться с DataAdapter-ом разобраться. Намного проще будет
0
|
24.12.2019, 14:40 | |
24.12.2019, 14:40 | |
Помогаю со студенческими работами здесь
20
Разбиение строки в FireBird - Firebird/InterBase Как разделить Dataset на 3 Dataset? Копирование данных из DataSet в DataSet Fast Report: "Cannot use the same dataset for Report.DataSet and Band.DataSet" Как или чем конвертировать таблицы из Firebird в MySQL или наоборот из MySQL в Firebird ?! Конвертирование Firebird 2.0 на Firebird 2.5 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |