Конструкції та методи захисту від помилкових нульових записів із бази даних


9

Одна частина моєї програми отримує дані з багатьох таблиць і стовпців моєї бази даних для обробки. Деякі стовпці можуть бути null, але в поточному контексті обробки це помилка.

Це "теоретично" не повинно відбуватися, тому, якщо це буде, це вказує на погані дані або помилку в коді. Помилки мають різну суворість, залежно від того, яке поле null; тобто для деяких полів обробку слід зупинити, а когось повідомити, для інших обробку слід дозволити продовжувати та просто повідомляти когось.

Чи є якась хороша архітектура чи принципи дизайну для обробки рідкісних, але можливих nullзаписів?

Рішення повинні бути можливі для реалізації з Java, але я не використовував тег, тому що я думаю, що проблема є дещо мовною-агностичною.


Деякі думки, які я мав сам:

Використання NOT NULL

Найпростіше було б використовувати обмеження NOT NULL в базі даних.

Але що робити, якщо оригінальна вставка даних важливіша, ніж цей наступний етап обробки? Тож у випадку, якщо вставка вставила б nullу таблицю (або через помилки чи, можливо, навіть з поважної причини), я б не хотів, щоб вставка провалилась. Скажімо, що набагато більше частин програми залежить від вставлених даних, але не від цього конкретного стовпця. Тому я скоріше ризикую помилкою на поточному етапі обробки замість кроку вставки. Тому я не хочу використовувати обмеження NOT NULL.

Наївно залежно від NullPointerException

Я міг би просто використовувати дані так, як ніби очікую, що вони завжди будуть там (і це дійсно має бути так), і вловлювати отримані NPE на відповідному рівні (наприклад, щоб обробка поточного запису припинялася, але не весь прогрес обробки ). Це принцип "невдало швидко", і я часто віддаю перевагу цьому. Якщо це помилка, принаймні я отримую зареєстрований NPE.

Але тоді я втрачаю здатність розмежовувати різні види відсутніх даних. Наприклад, для деяких відсутніх даних я можу їх залишити, але для інших обробку слід зупинити і повідомити адміністратора.

Перевірка nullперед кожним доступом та викидання спеціальних винятків

Спеціальні винятки дозволяють мені вирішити правильну дію на основі винятку, тому це, здається, є шляхом.

Але що робити, якщо я забуду його десь перевірити? Крім того, я забиваю свій код нульовими перевірками, яких ніколи і не рідко очікують (а це, безумовно, не є частиною потоку ділової логіки).

Якщо я вирішу йти цим шляхом, які схеми найкраще підходять для підходу?


Будь-які думки та коментарі щодо моїх підходів вітаються. Також кращі рішення будь-якого типу (шаблони, принципи, краща архітектура мого коду чи моделі тощо).

Редагувати:

Є ще одне обмеження, в тому, що я використовую ORM, щоб зробити відображення від БД до об'єкта стійкості, тому робити нульові перевірки на цьому рівні не буде працювати (оскільки ті ж об’єкти використовуються в частинах, де нуль не робить ніякої шкоди) . Я додав це, тому що надані відповіді обидва згадали цей варіант.


5
"Деякі стовпці можуть бути нульовими, але в поточному контексті обробки це помилка. ... у випадку, якщо вставка вставила б нуль у таблицю, я не хотів би, щоб вставка вийшла з ладу." Ці дві вимоги суперечливий. Це неможливо знайти рішення , поки не розслабити одне з двох умов.
Кіліан Фот

@KilianFoth Ну, моє розслаблення полягає в тому, що помилка в контексті "поточної обробки" менш серйозна, ніж при вставці. Тому я приймаю рідкісні помилки обробки, але хочу мати хороший надійний дизайн, щоб впоратися з ними. Ось чому NOT NULL, що інакше було б хорошим рішенням, тут неможливо.
jhyot

1
Якщо ви будете приймати так багато помилок, автори цих помилок ніколи їх не виправлять. Якщо їхні безладні вкладення заяв вдаються, який стимул вони коли-небудь мають виправити? Чи вважаєте ви надійним не збій, а сприйняття поганих даних?
Тулен Кордова

@ user61852 Я явно не приймаю помилки, але хочу їх виправити граціозно. Проковтування нульових покажчиків не підлягає. Крім того, що робити, якщо моя частина дійсно об'єктивно (як визначено бізнесом) менш важлива, ніж для багатьох інших частин, для яких вкладка потребує успіху, але не вимагає встановлення цього конкретного поля? Вставки походять не з запису користувача, де я можу змусити їх додати значення, а з іншого коду, де опущення, швидше за все, є помилкою (але недостатньо важливим, щоб зламати вставку).
jhyot

1
Позначення їх як НЕ НУЛЬНИХ в базі даних було б найкращим рішенням, якщо стовпець є нульовим, тоді код повинен обробляти той випадок, коли він є, навіть якщо цього не очікується, оскільки механізм зберігання дозволяє це.
Джон Рейнор

Відповіді:


9

Я поставив би нульові перевірки у ваш код картографування, де ви будуєте свій об'єкт із набору результатів. Це ставить перевірку в одне місце і не дозволить вашому коду пройти на півдорозі через обробку запису, перш ніж натиснути на помилку. Залежно від того, як працює потік вашої програми, ви, можливо, захочете виконати відображення всіх результатів як етап попередньої обробки замість того, щоб відображати та обробляти кожен запис по одному.

Якщо ви використовуєте ORM, вам доведеться виконати всі свої нульові перевірки перед обробкою кожного запису. Я рекомендую recordIsValid(recordData)метод -type, таким чином ви зможете (знову) зберегти всю логічну перевірку та іншу логіку перевірки в одному місці. Я точно не змішував би нульові чеки з іншою частиною вашої логіки обробки.


Дякую, це добре розуміння! Я дійсно використовую ORM, тому перевірки на цьому рівні не працюватимуть. Але я також маю декілька відображень на об'єкти реального домену з об'єктів стійкості. Я перевірю, чи можливе зробити відображення та перевірку на етапі попередньої обробки.
jhyot

А якщо ви переключите ORM, то що тоді? Краще захистити це у джерелі (див. Відповідь Дока Брауна).
Роббі Ді

@RobbieDee: Не має значення. Якщо вам доведеться переписати код зіставлення, то або нульові перевірки є там, і ви модифікуєте їх як частину перезапису, або у вас є окремий метод, який виконує перевірку нуля на ваших бізнес-об'єктах, тому не потрібно переписувати. І як випливає з Дока Брауна, іноді важливо помітити, що даних не вистачає замість того, щоб переглядати цей факт із значенням за замовчуванням.
TMN

Це має відбуватися далі в потоці ETL. Ви все одно ризикуєте дублювати зусилля таким чином.
Роббі Ді

6

Здається, що введення нуля - це помилка, але ви боїтеся застосувати цю помилку при вставці, оскільки не хочете втрачати дані. Однак, якщо поле не повинно бути нульовим, але є, ви втрачаєте дані . Тому найкращим рішенням є гарантувати, що нульові поля спочатку помилково не зберігаються.

З цією метою переконайтеся, що дані є правильними в одному авторитетному, постійному сховищі цих даних, базі даних. Зробіть це, додавши ненульові обмеження. Тоді ваш код може вийти з ладу, але ці помилки негайно повідомляють вас про помилки, що дозволяє виправити проблеми, які вже призводять до втрати даних. Тепер, коли ви зможете легко визначити помилки, протестуйте свій код і тестуйте його двічі. Ви зможете виправити помилки, що призводять до втрати даних, і в процесі цього значно спростить обробку даних нижче, оскільки вам не потрібно буде турбуватися про нулі.


2
Дякую за відповідь. Я погоджуюся, що ваше рішення - це правильний спосіб зробити це, і ви його сформулювали стисло. Обмеження поза моїм впливом можуть ускладнити або неможливо (наприклад, недоступні ресурси для тестування або для автоматичного тестування існуючого коду), але я, безумовно, повинен перевірити, чи може це рішення спрацювати, перш ніж спробувати інші способи. У своєму первісному мисленні я, можливо, занадто швидко припустив, що не можу виправити проблему в джерелі.
jhyot

@jhyot Гаразд. Це засмучує, коли ти не можеш робити речі в чистому порядку. Сподіваюся, моя відповідь принаймні корисна для інших, хто має подібні проблеми, але які здатні напасти на першопричину, а не прибирати безлад після факту.
Відновіть Моніку

5

Що стосується цього речення у питанні:

Це "теоретично" не повинно відбуватися, тому, якщо це буде, це вказує на погані дані або помилку в коді.

Я завжди цінував цю цитату (люб'язно дану статтю ):

Мені здається цікавим, коли початківці програмісти вважають, що їх головна робота - це запобігання збоїв у програмах. Я думаю, цей вражаючий аргумент невдачі не був би таким привабливим для такого програміста. Більш досвідчені програмісти розуміють, що правильний код - чудовий, код, який виходить з ладу, може вдосконалити, але неправильний код, який не виходить з ладу - це жахливий кошмар.

В основному: це здається, що ви схвалюєте Закон Постеля , "будьте консервативні в тому, що ви надсилаєте, будьте ліберальні в тому, що приймаєте". Хоча теоретично чудово, на практиці цей "принцип надійності" призводить до того, що програмне забезпечення не є надійним , принаймні в довгостроковій перспективі - а іноді і в короткостроковій перспективі. (Порівняйте статтю Еріка Аллмана " Принцип надійності" Переглянуто , що є дуже ретельним поводженням з предметом, хоча в основному зосереджене на справах використання мережевих протоколів.)

Якщо у вас є програми, які неправильно вставляють дані у вашу базу даних, ці програми порушені та потребують виправлення . Оформлення проблеми лише дозволяє їй продовжувати погіршуватися; це еквівалент програмного забезпечення, який дозволяє наркоману продовжувати свою залежність.

Прагматично кажучи, іноді вам потрібно дозволити продовжувати "зламану" поведінку хоча б тимчасово, особливо як частину безперебійного переходу від розслабленого, порушеного стану до суворого, правильного стану. У такому випадку ви хочете знайти спосіб, щоб дозволити неправильним вставкам досягти успіху, але все ж дозволити "канонічному" сховищу даних завжди знаходитись у правильному стані . Існують різні способи зробити це:

  • Використовуйте тригер бази даних для перетворення неправильно сформованих вставок у правильні вставки, наприклад, замінивши відсутні / нульові значення за замовчуванням
  • Попросіть неправильні програми вставити в окрему таблицю баз даних, яка дозволена "неправильно", і мати окремий запланований процес або інший механізм, який переміщує виправлені дані з цієї таблиці в канонічний сховище даних
  • Використовуйте фільтрацію на стороні запитів (наприклад, перегляд), щоб переконатися, що дані, отримані з бази даних, завжди в правильному стані, навіть якщо дані в спокої не є

Один із способів обійти всі ці проблеми - це вставити API-рівень, який ви контролюєте між програмами, що видають запис, та фактичною базою даних.

Здається, що частина вашої проблеми полягає в тому, що ви навіть не знаєте всіх місць, які створюють неправильні записи, - або що їх просто занадто багато для оновлення. Це страшний стан, але воно ніколи не повинно дозволяти виникати в першу чергу.

Як тільки ви отримаєте більше ніж декілька систем, яким дозволено змінювати дані в канонічному сховищі виробничих даних, у вас виникнуть проблеми: немає жодного способу централізовано підтримувати щось про цю базу даних. Краще було б дозволити якомога менше процесів видавати записи, а також використовувати їх як "воротарі", які можуть попередньо обробити дані перед тим, як потрібно вставити. Точний механізм цього дійсно залежить від вашої конкретної архітектури.


"Якщо у вас є програми, які неправильно вставляють дані у вашу базу даних, ці програми порушені і їх потрібно виправити." це теж чудово в теорії, але реальність полягає в тому, що вони все ще додаватимуть записи, тоді як якийсь комітет продовжує обговорювати питання щодо використання "NA" чи "None".
JeffO

@JeffO: Жоден комітет не повинен обговорювати, чи зберігати в базі даних "NA", "None", NULL чи щось інше. Нетехнічні зацікавлені сторони мають роль у тому, які дані виходять із бази даних та як вони використовуються, але не у внутрішньому представництві.
Даніель Приден

@DanielPryden: На моїй останній роботі у нас був комітет з розгляду архітектури (з підкомітетом DBA), який би переглядав технічні зміни між доменами. Дуже технічно, але вони зустрічалися лише кожні два тижні, і якщо ви не надали достатньо деталей для них, вони відкладуть рішення, поки ви не зробите ... на наступній зустрічі. Більшість нетривіальних системних змін, які не полягали в додаванні функціональних можливостей за допомогою нового коду, зазвичай займуть місяць або близько того.
TMN

@DanielPryden - Я сидів на зустрічах із керівництвом вищого керівництва, де обговорювали мітки текстового поля. Ви можете стверджувати, що це не має нічого спільного з тим, що ви будете називати його в додатку чи базі даних, але це так.
JeffO

У відповідь на коментарі щодо отримання додаткових схвалень для подібних змін: моя думка про те, що значення є "неправильними", передбачає, що допустимі значення десь уже задокументовані - тому ОП говорить, що ці значення слід вважати помилкою. Якщо схема бази даних вказана для дозволу значення, то це значення не є помилкою. Справа в тому, що якщо у вас є дані, які не відповідають вашій схемі, щось порушено: ваш пріоритет повинен полягати в тому, щоб дані та схема відповідали. Залежно від команди, що може включати зміну даних, схеми чи обох.
Даніель Приден

2

" Чи є хороша архітектура або принципи дизайну для обробки рідкісних, але можливих нульових записів? "

Проста відповідь - так.

ETL

Проведіть деяку попередню обробку, щоб переконатися, що дані є достатньо якісними, щоб перейти до бази даних. Що-небудь у файлі, що випадає, слід повідомити назад, а будь-які чисті дані можна завантажити в базу даних.

Як людина, яка була і браконьєром (розробником), і власником ігор (DBA), я з гіркого досвіду знаю, що треті сторони просто не вирішуватимуть свої дані, якщо їх не змусять. Постійно згинаючи назад і масажуючи дані за допомогою небезпечного прецеденту.

Март / сховище

У цьому випадку необроблені дані висуваються в БД репозиторію, а потім дезінфікована версія передається до БД mart, до яких додатки мають доступ.

Значення за замовчуванням

Якщо ви можете застосувати чутливі значення за замовчуванням до стовпців, тоді вам слід, хоча це може включати певну роботу, якщо це вже наявна база даних.

Невдача рано

Заманливо просто вирішити проблеми з даними на шлюзі до програми, набору звітів, інтерфейсу тощо. Я настійно раджу не покладатися тільки на це. Якщо ви підключите якийсь інший віджет до БД, ви, можливо, знову зіткнетеся з тими ж проблемами. Вирішити питання якості даних.


+1 Це я б робив, збирав усі дані та створював дійсний набір даних для вашої програми.
Kwebble

1

Всякий раз, коли ваш випадок використання дозволяє безпечно замінити NULL на хороше значення за замовчуванням, ви можете зробити перетворення в SELECTоператорах Sql за допомогою ISNULLабо COALESCE. Тож замість

 SELECT MyColumn FROM MyTable

можна писати

 SELECT ISNULL(MyColumn,DefaultValueForMyColumn) FROM MyTable

Звичайно, це спрацює лише тоді, коли ORM дозволить безпосередньо маніпулювати вибраними операторами або надати змінні шаблони для генерації. Слід переконатися, що жодних "справжніх" помилок не маскується таким чином, тому застосовуйте їх лише у тому випадку, якщо заміна за замовчуванням саме те, що потрібно у випадку NULL.

Якщо ви зможете змінити базу даних і схему, і ваша система db підтримує це, ви можете розглянути можливість додавання до конкретних стовпців застереження про значення за замовчуванням, як це запропонував @RobbieDee. Однак для цього також буде потрібно змінити наявні дані в базі даних, щоб видалити будь-які раніше вставлені значення NULL, і це дозволить згодом розрізняти правильні та неповні дані імпорту.

З власного досвіду я знаю, що використання ISNULL може спрацювати напрочуд добре - в минулому мені довелося підтримувати застарілий додаток, коли оригінальні розробники забули додати НЕ NULL обмеження до безлічі стовпців, і ми не могли легко додати ці обмеження пізніше з якихось причин. Але в 99% усіх випадків 0 за замовчуванням для стовпців з цифрами та порожній рядок як стандартний для текстових стовпців був цілком прийнятним.


Незважаючи на це, ви можете дублювати захисний код для кожного SELECT. Набагато кращим підходом є визначення значення за замовчуванням для стовпця, коли вставляється NULL, хоча це може бути неможливим / бажаним з різних причин.
Роббі Ді

@RobbieDee: дякую за це зауваження, я відповідно змінив свою відповідь. Однак, якщо це "набагато краще", це дискусійне питання. Коли код CRUD знаходиться в одному місці, дублювання оборонного коду може не бути великою проблемою. А якщо це не так, заздалегідь є певне дублювання коду.
Док Браун

Прості CRUD-операції, звичайно, ідеальні. Але в реальному світі системи часто мають складні погляди на інтерфейс користувача, майстри даних, створені користувачем, звіти тощо. Але, як ви вказали, значення за замовчуванням повинні бути з нуля або принаймні вимагати певних початкових зусиль для перетворення. Те, що ви описали, може бути кращим у розробці коричневого поля.
Роббі Ді

Найкраща відповідь. Нові програми зазвичай додають нові дані, які можуть бути поза вашим контролем. Помилкові NULL зазвичай походять від імпорту застарілих даних у перероблені бази даних. Для цього вимкнено обмеження, щоб дозволити його виконати через кілька годин замість кількох днів. "Великий провал" часто настає, коли АТД намагаються знову включити обмеження. Оскільки цього ніколи не планувалося, керівництво часто випробовує на тижні роботи, часто вимагає виправити погані дані, тому це залишається. Усі додатки повинні витончено обробляти NULL, вставляючи стандартні налаштування, звітуючи або запитуючи про відсутні дані, інакше.
DocSalvager

1

ОП вважає відповіддю, що поєднує правила ведення бізнесу з технічними деталями бази даних.

Це "теоретично" не повинно відбуватися, тому, якщо це буде, це вказує на погані дані або помилку в коді. Помилки мають різну суворість, залежно від того, яке поле є нульовим; тобто для деяких полів обробку слід зупинити, а когось повідомити, для інших обробку слід дозволити продовжувати та просто повідомляти когось.

Це всі правила ведення бізнесу. Правила бізнесу не стосуються нульових дій. Всім відомо, що база даних може мати null, 9999, "BOO!" ... Це просто інша цінність. Те, що в RDBMS, null має цікаві властивості та унікальне використання - суперечка.

Єдине, що важливо - це те, що означає "нульовість" для даного бізнес-об'єкта ...

Чи є якісна архітектура або принципи дизайну для обробки рідкісних, але можливих нульових записів?

Так.

  • Поставте ділові правила на заняттях.
  • Транслітерація повинна знаходитись у відповідному рівні коду, що відокремлює бізнес-класи та сховище даних. Якщо ви не можете помістити його в код ORM, принаймні не ставте його до бази даних.
  • Зробіть базу даних тупою, наскільки це можливо, тут немає жодних правил бізнесу. Навіть нешкідливі речі, такі як дефолт цінності, укусять вас . Був там.
  • Перевірка даних, що надходять до бази даних та надходять до неї. І звичайно, це робиться в контексті об'єктів бізнесу.

Кидати виняток під час пошуку даних не має сенсу.

Питання: "чи потрібно зберігати" погані "дані?" Це залежить:

  • Можливо, використовуються погані дані - ніколи не зберігайте недійсні об'єкти чи об'єкти композитів. Складні дані / ділові відносини всюди. Користувачі можуть виконувати будь-яку функцію в будь-який момент часу, можливо, використовуючи цю суб’єкт господарювання у ряді контекстів. Ефект поганих даних (якщо такі є) на час їх збереження невідомий, оскільки він сильно залежить від майбутнього використання. Не існує єдиного / єдиного процесу цих даних.
  • Неможливо прогресувати, якщо є погані дані - Дозволити збереження поганих даних. Однак наступний крок у процесі не може продовжуватися, поки все не дійсне. Наприклад, робити податки на прибуток. При отриманні з бази даних програмне забезпечення вказує на помилки, і воно не може бути подано до IRS без перевірки дійсності.

0

Існує багато способів поводження з нулями, тому ми перейдемо від рівня бази даних до рівня додатків.


Шар бази даних

Ви можете заборонити нулі ; хоча тут це недоцільно.

Ви можете налаштувати за замовчуванням на основі стовпця:

  • він вимагає, щоб стовпець був відсутній у insert, тому не охоплює явну вставку нуля
  • це запобігає виявленню з рядків, де insertпомилково пропущено цей стовпець

Ви можете налаштувати тригер так, що при введенні пропущені значення автоматично обчислюються:

  • він вимагає, щоб необхідна інформація для проведення цих обчислень була присутня
  • це сповільнить insert

Шар запиту

Ви можете пропускати рядки, де незручно null:

  • це спрощує основну логіку
  • це перешкоджає виявленню "поганих рядків", тому для їх перевірки знадобиться інший процес
  • це вимагає, щоб кожен запит був задокументований

Ви можете вказати значення за замовчуванням у запиті:

  • це спрощує основну логіку
  • це перешкоджає виявленню "поганих рядків", тому для їх перевірки знадобиться інший процес
  • це вимагає, щоб кожен запит був задокументований

Примітка: інструментація кожного запиту не обов'язково є проблемою, якщо у вас є автоматизований спосіб їх генерації.


Прикладний шар

Ви можете попередньо перевірити таблицю на наявність заборонених null:

  • це спрощує основну логіку
  • це покращує час до відмови
  • це вимагає дотримання логіки попередньої перевірки та логіки програми

Ви можете перервати обробку, зіткнувшись із забороненим null:

  • це дозволяє уникнути дублювання знань про те, які стовпці можуть бути, nullа які - не
  • це все ще порівняно просто (лише перевірка + повернення / кидок)
  • це вимагає, щоб ваш процес був відновлений (якщо ви вже надіслали електронний лист, не хочете надсилати його двічі або сто разів!)

Ви можете пропустити рядок, зіткнувшись із забороненим null:

  • це дозволяє уникнути дублювання знань про те, які стовпці можуть бути, nullа які - не
  • це все ще порівняно просто (лише перевірка + повернення / кидок)
  • це не вимагає, щоб ваш процес був відновлений

Ви можете надсилати сповіщення, коли зустрічаєтесь із забороненим null, або по одному, або партією, що вітається з інших способів, представлених вище. Найважливіше, однак, це "що тоді?", Особливо, якщо ви очікуєте, що рядок буде виправлений і потребує повторної обробки, вам може знадобитися, щоб ви мали змогу відрізнити вже оброблені рядки від рядків, які потребують підлягає переробці.


З огляду на вашу ситуацію, я б вирішив ситуацію із заявою та поєднав:

  • переривати і повідомляти
  • пропустити та повідомити

Я схильний би просто пропустити, якщо можливо, якось гарантувати прогрес прогресу, особливо якщо обробка може зайняти час.

Якщо вам не потрібно повторно обробляти пропущені рядки, просто їх реєстрація має бути достатньою, і повідомлення електронної пошти, надіслане в кінці процесу з кількістю пропущених рядків, буде влучним сповіщенням.

В іншому випадку я б використав бічну таблицю для закріплення (і повторної обробки) рядків. Цей бічний стіл може бути або простим посиланням (без стороннього ключа), або повноцінною копією: остання, навіть якщо дорожча, необхідна, якщо у вас немає часу на вирішення проблеми nullперед тим, як очистити основні дані.


-1

З нулями можна обробляти під час перекладу чи відображення типів баз даних на типи мов. Наприклад, у C #, ось загальний метод, який обробляє null для вас для будь-якого типу:

public static T Convert<T>(object obj)
        {
            if (obj == DBNull.Value)
            {
                return default(T);
            }

            return (T) obj;
        }

public static T Convert<T>(object obj, T defaultValue)
        {
            if (obj == DBNull.Value)
            {
                T t = defaultValue;
                return t;
            }

            return (T) obj;
        }

Або, якщо ви хочете виконати дії ...

 public static T Convert<T>(object obj, T defaultValue)
        {
            if (obj == DBNull.Value)
            {
                //Send an Alert, we might want pass in the name
                //of column or other details as well
                SendNullAlert();
                //Set it to default so we can keep processing
                T t = defaultValue;
                return t;
            }

            return (T) obj;
        }

І тоді в відображенні, в даному випадку до об’єкта типу "Зразок", ми обробляємо null для будь-якого зі стовпців:

public class SampleMapper : MapperBase<Sample>
    {
        private const string Id = "Id";
        private const string Name = "Name";
        private const string DataValue = "DataValue";
        private const string Created = "Created";

        protected override Sample Map(IDataRecord record)
        {
            return new Sample(
                Utility.Convert<Int64>(record[Id]),
                Utility.Convert<String>(record[Name]),
                Utility.Convert<Int32>(record[DataValue]),
                Utility.Convert<DateTime>(record[Created])
                );
        }
    }

Нарешті, всі класи відображення можуть бути автоматично сформовані на основі запиту SQL або таблиць, що беруть участь, переглядаючи типи даних SQL та перекладаючи їх на конкретні типи даних. Це те, що багато ОРМ роблять для вас автоматично. Зауважте, що деякі типи баз даних можуть не мати прямого відображення (геопросторові злучки тощо), і може знадобитися спеціальне оброблення.


Якщо хтось хоче опублікувати еквівалентну версію Java, це було б чудово ...
Джон Ренор

Я думаю, що приклад коду цілком зрозумілий і для розробників Java. У моїй ситуації у мене вже є ORM, тому не потрібно її застосовувати. Але ваша відповідь стосується лише значень за замовчуванням для нулів, тоді як у моєму випадку насправді набагато важливішим випадком є ​​виявлення нуля та ініціювання дії (наприклад, повідомте адміністратора про помилкові дані).
jhyot

А-а-а, я оновлю свою відповідь на основі цього.
Джон Рейнор

Ваш відредагований код тепер має одну дію за замовчуванням для будь-якого нульового значення (тобто воно є абсолютно загальним). Це дуже схоже на мій другий варіант у первісному запитанні, тобто просто киньте на null і кудись його ловіть. Але, як зазначено там, мені потрібно диференціювати дії, виходячи з того, яке значення відсутнє.
jhyot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.