Аналог DataTable, содержащего нуль вместо DbNull? - PullRequest
0 голосов
/ 01 ноября 2018

Мне была поручена очень большая миграция данных из старой, случайной, шаткой системы в современную. Часть работы состоит в том, чтобы сопоставить старые данные с файлами импорта, которые соответствуют строгой типизации новой базы данных, поскольку старая имела много столбцов varchar, даже если она содержала только целые числа. Использование также изменилось за эти годы, поэтому есть столбцы каждого типа данных, которые могут содержать нулевое значение.

Необходимым компонентом проекта является уточнение всего через программу C # для генерации файлов импорта. Программа должна Convert столбцы для новых типов данных, которые соответствуют свойствам объекта, вызывающего слой данных (обрабатывается путем отражения), но завершается неудачей, если она встречает DbNull. Это может быть любой столбец, и каждый DataTable может иметь до 120 столбцов.

Я пытался сохранить вместо него значение .Net null, но это выдает ошибку, которую я не могу сохранить null, просто DbNull. Есть ли лучше подходит для этого? Мне просто нужна конструкция типа DataTable, которая может принимать null в качестве значения столбца. Я пытаюсь избежать модификации каждого конструктора для объектов, которые хранят эти данные, так как это будет пара недель программирования для получения каждого используемого объекта. Гораздо предпочтительнее использовать совместимый источник данных.

Чтобы проиллюстрировать, вот (не работающий по понятным причинам) код из библиотеки доступа к данным:

        private static DataTable Clean(DataTable dt)
    {           
        foreach(DataRow r in dt.Rows)
            for ( int i = 0; i<= r.ItemArray.Count(); i++) //(object i in r.ItemArray)
            {
                r[i] = Convert.IsDBNull(r[i]) ? null : r[i];

            }
        return dt;
    }

Вы не можете присвоить null значению столбца в таблице данных. Но причина, по которой я даже попробую, состоит в том, что в программе, вызывающей библиотеку, есть несколько сотен мест (до 120 на конструктор класса) с такими вещами, как этот код:

 p.DateOfHire = Convert.ToDateTime(r["started_on"]);

Я пытаюсь сделать данные удобочитаемыми, прежде чем они достигнут назначения. Я думаю, что мне может понадобиться коллекция, которая очень похожа на DataTable, поэтому она может иметь значения, вызываемые одинаково.

Редактировать 2: я рассматривал что-то вроде этого:

public static T ConvertFromDBVal<T>(object obj) { if (obj == null || obj == DBNull.Value) { return default(T); // returns the default value for the type } else { return (T)obj; } }

, но я не могу заполнить поля значениями по умолчанию .Net, когда создаю файлы для импорта в новую систему.

...