powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / как лучше сделать
25 сообщений из 34, страница 1 из 2
как лучше сделать
    #38350899
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, есть проект. Первая часть проекта, есть перенос базы из mdb(около 10 таблиц) в ms sql(в соответствующую,конечно предварительно созданную). Так вот, в принципе одну таблицу перенес( десятки тысяч строк). Но есть нюанс,в акцессной базе есть поля- даты. В ms sql есть соответствующие в таблице поля с типом datetime.Если запись корректна, то переносится без проблем.
переношу так:
одна из строк конструкции insert into
......
......
Код: plaintext
1.
commandSQL += "CONVERT(DATETIME,'"+RecordSetOleDB["data"]+"',104),";


RecordSetOleDB - метод OleDbDataReader,в общем возвращается дата из таблицы mdb, затем конвертирую и принципе всё ок.
Но если в mdb поле дата заполнено не корректно,например так 01.01.182 или 01.01.248, то возникает ошибка, не помню дословно, но суть в том что не может нормально сковертировать. по сути правильно.

Варианты:
1.отрубить руки кто заполнял, конечно вариант хороший,но не по делу
2. можно ли в таком формате и инсёртить в базу?но у меня же поле в базе datetime
3.думал на крайняк,проходить предварительно базу акцесс и смотреть,если попадается строка с неправильной датой,то обнулять её типа 2222-01-01
...
Рейтинг: 0 / 0
как лучше сделать
    #38350905
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell,

3.1 - инвалидные даты в NULL предварительно
...
Рейтинг: 0 / 0
как лучше сделать
    #38350918
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell1.отрубить руки кто заполнял, конечно вариант хороший,но не по делу

Зато отрубить руки тому, кто использует непараметризованные запросы - по делу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как лучше сделать
    #38350967
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
K C++ вопрос не относится, вообще-то. Это ближе к проектированию систем и администрированию баз данных.

В общем случае миграция делается так:
- Читаешь строку из исходной таблицы.
- Проверяешь на правильность данных.
- Если нашел кривые данные - пытаешься догадаться что оператор имел в виду когда печатал чушь. Например если ты знаешь что работаешь с датой рождения и видишь человека родившегося в 2070-ом году - догадываешься что это должен быть 1970 и исправляешь.
- Если исправить не получается - либо обнуляешь кривые данные, либо сбрасываешь в какое-то специальное значение, либо убиваешь строку (или весь логический объект) целиком.
- Не забывай записывать все случаи исправлений-убиваний записывать в журнал. Потом читай его и ищи где можно улучшить процедуру исправления кривых данных. После нескольких прогонов получишь конфетку.

И все...

Параметризованные запросы используются или нет, в данном случае не важно. Ты уже будешь контролировать все данные уходящие в целевую базу так что проблем из-за "склееных" запросов не будет.
...
Рейтинг: 0 / 0
как лучше сделать
    #38351748
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell2. можно ли в таком формате и инсёртить в базу?но у меня же поле в базе datetime


Инсёртить можно, только нифига не проINSERT-ится.
(т.е. грубо говоря, нельзя).

Естественно, надо исправлять.

denis_stell3.думал на крайняк,проходить предварительно базу акцесс и смотреть,если попадается строка с неправильной датой,то обнулять её типа 2222-01-01


Лучше NULL. Если схема данных позволяет.
...
Рейтинг: 0 / 0
как лучше сделать
    #38351955
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заполнять NULL-ом. А если есть поле COMMENT то добавить туда запись о некорректной дате
и прикрепить строку даты как есть. Далее - посадить девочек-пионерок чтоб вручную исправили все даты.
...
Рейтинг: 0 / 0
как лучше сделать
    #38352190
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
до загрузки лучше данные чистить, таково ИМХО
...
Рейтинг: 0 / 0
как лучше сделать
    #38352207
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо
...
Рейтинг: 0 / 0
как лучше сделать
    #38352237
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилmayton,
до загрузки лучше данные чистить, таково ИМХО
Когда грузят данные из сторонних систем то их обычно льют в промежуточные таблицы как есть.
С битыми датами, денежными величинами, кривыми ключами. Потом из этих промежуточных
какой-то логикой чистят и грузят что можно в таблицу бизнес-фактов.
...
Рейтинг: 0 / 0
как лучше сделать
    #38352247
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

насколько система "сторонняя" - не сказазно - скорее своё добро мамонта, а его не грех почистить
...
Рейтинг: 0 / 0
как лучше сделать
    #38352257
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИзопропилmayton,
до загрузки лучше данные чистить, таково ИМХО
Когда грузят данные из сторонних систем то их обычно льют в промежуточные таблицы как есть.
С битыми датами, денежными величинами, кривыми ключами. Потом из этих промежуточных
какой-то логикой чистят и грузят что можно в таблицу бизнес-фактов.

Как бы если это всё можно проделать на клиенте до заливки, то лучше так и делать.
Загрузка в БД во временное хранилище оправдано только, если другими способами как в БД (используя естественно SQL или PL SQL)
данные не обработать. А так -- это напрасная трата времени и ресурсов.
...
Рейтинг: 0 / 0
как лучше сделать
    #38352268
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЗагрузка в БД во временное хранилище оправдано только, если другими способами как в БД (используя естественно SQL или PL SQL)
данные не обработать. А так -- это напрасная трата времени и ресурсов.Не знаю при каких условиях данные нельзя почистить на клиенте.
Вот как раз временные хранилища в БД я назову напрасной тратой времени и ресурсов.
...
Рейтинг: 0 / 0
как лучше сделать
    #38352327
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Ну я как бы тоже на это намекал.
Но всякое бывает...
...
Рейтинг: 0 / 0
как лучше сделать
    #38360054
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо.
сделал следующим образом, до загрузки контроль данных,при котором все "кривые" даты затираются в NULL, а исходные даты помещаю в примечание.
Столкунлся с проблемой,точнее может с моей неопытностью пока что как то так:
В общем как и было оговорено, есть база на access, импортирую в ms sql.
Всего получилось нужных 6 таблиц, всего порядка 300000-500000 записей. mdb грузится каждый день, в файле некоторые данные добавляются,некоторые просто новые.
реализовал 6 потоков, в потоковой функции сам импорт.
работа с mdb через
OleDbConnection
OleDbDataReader
OleDbCommand итд
с ms sql
SqlConnection,SqlCommand....
часть кода
while (RecordSetOleDB_BL.Read()) // прохожусь по базе акцесс, и тут 2 действия
1) если в базе уже есть данные удаляю
Код: plaintext
1.
2.
sqlcom_bl.CommandText = "delete from cl where a1="+RecordSet["acc_id_src"]
                 sqlcom_bl.ExecuteNonQuery();


2) сам импорт

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
     sqlcom_bl.cancel();
     sqlcom_bl.CommandText = " insert into .....
     sqlcom_bl.CommandText += "CONVERT(DATETIME,'" + RecordSet["data"] + "',104),";
     sqlcom_bl.CommandText +=RecordSetOle["saldo_cur"] + ",";
...
...
...
   try
                {
                    sqlcom_bl.ExecuteNonQuery();
                }
                catch
                {
                    MessageBox.Show("Ошибка при загрузке потока Bln!");
                    sErrBln = sqlcom_bl.CommandText;
                    break;
                }


в конце выхожу из команд, закрываю соединения итд
.
В общем отрабатывает, но очень долго, как ускорить процесс?
...
Рейтинг: 0 / 0
как лучше сделать
    #38360066
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell,

Во-первых нужен только один поток, так как вы пишете на один диск, и тут чем больше потоков тем медленнее запись.
Во-вторых не изобретайте велосипед, а воспользуйтесь каким-либо штатным средством, их великое множество, как минимум вспоминаю Data Pump и Linked Server в скуле.
В третьих используйте bulk insert.

Всего-то надо пару insert into select from запросов написать. И вообще вам в соответствующий форум надо обращаться (MS SQL Server, MS Access). Едете в Париж через Австралию.
...
Рейтинг: 0 / 0
как лучше сделать
    #38360157
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_,
Замечание о потоках верно, все остальное не верно.
Ни блочные заливки, ни "штатные средства" ему не помогут. Первое умрет на этапе кривых данных (прочитай первый пост топика). А "штатные средства" либо тоже умрут на кривых данных, либо потребуют не малых денег, а потом еще и не малого времени на настройку.

denis_stell,
Мне сильно кажется что ты занимаешься переливкой данных. Читаешь из одной таблицы и пишешь в другую. Так? Если "да", то очень плохо.
Сделай на клиенте структуры (классы) представляющие собой бизнес-объекты. Потом заполняешь эти объекты из одной базы, и после того как собрал объект целиком - пишешь в новую базу. Простой цикл в один поток. Просто, легко и надежно.
Этот подход даст тебе намного более удобный для дальнейшей работы лог ошибок. Сможешь писать туда что-нибудь в духе: "Клиент ФЫВА имеет плохую дату в дне рождения. Клиент ЯЧСМ имеет три контракта в списке контрактов, но найдено только два контракта найдено в реальности". Потом отдаешь этот список начальству и тем кто вбивает данные в старую базу - они исправляют данные.
Заодно сможешь с легкостью изменить структуру хранения данных в новой БД.
У меня подобные схемы работали (и работают) очень даже замечательно.
А по скорости работы зависит от объема исходной базы и драйверов доступа к базам. Когда-то, на заре века, у меня двухгиговая DBF база превращалась таким образом в ASA7 за два часа. Сегодня 50Г данных переливаются из MS SQL 2008 в ASE 15 за час. В обоих случаях программы-превращатели написаны на С.
...
Рейтинг: 0 / 0
как лучше сделать
    #38360166
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ему бы хотя бы параметризованные запросы освоить...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
как лучше сделать
    #38360182
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

о чем это вы. Это стандартная ДБА задача. Какие еще программы на компилируемых языках. Люди на TransactSQL биллинги целые пишут, включая работу с устройствами, файлами и со всем остальным, а вы говорите на плохих данных ляжет ). Ровно один запрос на каждую таблицу, независимо от того что там с данными, ровно два запроса при использовании bulk insert. При том что править их в десятки раз быстрее, поправил-попробовал, поправил-попробовал. А тут компилируй, подключись, запусти, посмотри, ищи ошибку. Смех да и только.

Топикстартер, напишите в MS SQL Server что надо сделать, вам за 5 минут решение предложат.
...
Рейтинг: 0 / 0
как лучше сделать
    #38360193
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_White Owl,

о чем это вы. Это стандартная ДБА задача. Какие еще программы на компилируемых языках. Люди на TransactSQL биллинги целые пишут, включая работу с устройствами, файлами и со всем остальным, а вы говорите на плохих данных ляжет ).Это далеко не стандартная задача и уж совсем не для DBA. Это задача для дата-архитектора, а не администратора сервера.

sherzod_ Ровно один запрос на каждую таблицу, независимо от того что там с данными, ровно два запроса при использовании bulk insert.Вот это и есть твоя ошибка. Ты не смотришь на то "что там с данными". Да, в идеальном мире, источником данных будет идеальная база с идеальной целостностью данных. Тогда действительно данные типа "имя" или данные типа "адрес" можно получить разом по всем контрагентам за один запрос. Но в реальности, мы вынуждены жить с базами в которых бывают контрагенты без имени и имена без контрагентов.
А так же, задача миграции с одной базы на другую всегда сопровождается сменой структуры базы. Раньше имя хранилось так, а теперь имя будет хранится сяк. Раньше накладные хранились в двух таблицах, а сейчас будут в двадцати-двух. Смену структуры хранения ты в конечно в несколько запросов упихать сможешь, но bulk insert обломается.

sherzod_ При том что править их в десятки раз быстрее, поправил-попробовал, поправил-попробовал. А тут компилируй, подключись, запусти, посмотри, ищи ошибку. Смех да и только.Смейся. Когда сам попробуешь позаниматься мигрированием БД - будешь смеяться еще раз.
...
Рейтинг: 0 / 0
как лучше сделать
    #38360225
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Вы понимаете что TransactSQL может все? В том числе обработать любые ошибки в данных. Это полноценный язык программирования предназначенный именно для таких задач. Но даже это не важно. Важно то что в даже рамках ANSI SQL указанная задача преобразования дат решается простым coalesce.

А миграцией данных тут каждый первый занимался. На скульру как никак находимся. И уж точно никакой DB специалист не станет писать для миграции программу на си или плюсах. Это нонсенс. У нас для таких задач максимум что написано (причем на шарпе), так это скриптовалка, которая анализируя схему выдает скрипты дифов схем. А вы говорите миграция на плюсах. Не 80-й год ведь. Пока вы там неделю ваять будете и баги править, DBA вам скриптик накатает минут за 5 для одной таблицы, со всеми обработками ошибок. Еще на фортране посоветуйте миграцию сделать.

И не путайте роли. Дело архитектора схему разработать а не скриптики миграции писать, последнее теоретически делает дба или разработчик, а практически дба или дба.
...
Рейтинг: 0 / 0
как лучше сделать
    #38360238
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_DBA вам скриптик накатает минут за 5 для одной таблицы, со всеми обработками ошибок.
а DBA то здесь причём?
...
Рейтинг: 0 / 0
как лучше сделать
    #38360241
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребят, то что грузиться через С(точнее проект на С#), это только маленькая часть всего проекта,это только парс данных,для анализа данных в последующем,расчета прибыльности филиала и много чего ещё.
сначала подумал,за способ.который когда то сам делал,что то типа этого,к примеру
Код: sql
1.
2.
INSERT INTO cl (d1,d2,d3) 
   SELECT  * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','\\db04\share\base.mdb';'admin';'',Customers)

.
но решил,что средствами visual studio,т.е. анализирую данные здесь в коде,конвертации даты,времени и других полей.
Если рассматривать параметризированные запросы, будут ли они отрабатывать быстрее?чем в моём случае?
Хранимые процедуры?
...
Рейтинг: 0 / 0
как лучше сделать
    #38360244
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_stell,

проще на аксессе данные в порядок привести и из него загрузить куда надо
...
Рейтинг: 0 / 0
как лучше сделать
    #38360250
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,
так у меня и реализовано,изменение некорректных данных, но если правильно понимаю, при переносе из акцесса, в любом случае же нужно данные подбивать? например те же даты(корректные)
...
Рейтинг: 0 / 0
как лучше сделать
    #38360254
denis_stell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot White Owl
Мне сильно кажется что ты занимаешься переливкой данных. Читаешь из одной таблицы и пишешь в другую. Так? Если "да", то очень плохо.
Сделай на клиенте структуры (классы) представляющие собой бизнес-объекты. Потом заполняешь эти объекты из одной базы, и после того как собрал объект целиком - пишешь в новую базу. [/quot]

именно переливка и уже понял,что плохо.
интересен ваш вариант, можете привести пример(код), на пальцах или ссылку где есть что-то подобное?
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / как лучше сделать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]