Как создать новый столбец в наборе данных типа

У меня есть типизированный объект набора данных, который извлекает таблицу из моей базы данных sql-сервера. Насколько я знаю, sql-server не поддерживает тип TimeSpan. Как мне добавить этот новый столбец в мой код С#?

На данный момент у меня есть столбец, который содержит тики, поэтому в базе данных я буду хранить количество тиков, которое затем будет преобразовано в TimeSpan и наоборот (TimeSpan будет редактироваться в приложении и будет затем преобразуются в тики, которые затем помещаются в базу данных). Моя проблема в том, что, поскольку это типизированная база данных, которая будет использоваться вместе с элементом управления DevExpress (элемент управления Ганта), я не знаю, как добавить новый столбец TimeSpan и использовать его?

Единственное решение, которое я вижу, это создать новую таблицу данных на основе первой, скопировать в нее данные, работать с ней, и как только пользователь захочет обновить, вернуть ее в мой типизированный набор данных и использовать sprocs для внесения изменений, а затем вернуться , но это не похоже на лучшее решение... Есть идеи?

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

public TimeSpan TimeSpanDuration
{
    get => IsDurationNull() ? new TimeSpan(Duration) : TimeSpan.Zero;
    set => Duration= value.Ticks;
}

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ничто не мешает вам добавлять свойства в типизированный набор данных; в конце концов, это всего лишь то, что сделала для вас визуальная студия. Откройте свой набор данных, дважды щелкните таблицу данных, и вы перенесетесь в представление кода с предварительно заполненным partial class YourTablename. Щелкните правой кнопкой мыши YourTableName и выберите Goto Definition, чтобы найти таблицу в файле YourDataSet.Designer.cs.

Почитайте; это просто набор кода, который устанавливает именованные свойства для базовой таблицы данных и ее столбцов. Используйте раскрывающийся список в верхней части окна кода, чтобы найти разделяемый класс для строк вашей таблицы. Вот как столбец Birthdate моей таблицы Person выглядит в строке (свойство, которое получает дату рождения в упаковке как объект из массива элементов datarow и приводит его к дате и времени, поэтому мне не нужно):

        public System.DateTime Birthdate {
            get {
                try {
                    return ((global::System.DateTime)(this[this.tablePerson.BirthdateColumn]));
                }
                catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("The value for column \'Birthdate\' in table \'Person\' is DBNull.", e);
                }
            }
            set {
                this[this.tablePerson.BirthdateColumn] = value;
            }
        }

Ничто не мешает мне объявить собственный partial class PersonRow в моем собственном коде (не делайте этого в файле дизайнера - он будет потерян - сделайте это в файле, в который вы были перенесены, когда дважды щелкнули таблицу данных в дизайнере), который имеет такое свойство, как:

        public int AgeInYears {
            get {
                try {
                    return (DateTime.Now - ((global::System.DateTime)(this[this.tablePerson.BirthdateColumn]))).Years;
                }
                catch (global::System.InvalidCastException e) {
                    throw new global::System.Data.StrongTypingException("The value for column \'Birthdate\' in table \'Person\' is DBNull. so the age cannot be calculated", e);
                }
            }
            set { //do we really want to allow setting via years??
                this[this.tablePerson.BirthdateColumn] = DateTime.Now.AddYears(-value);
            }
        }

Создайте столбец, соответствующий тому, как SQLS хранит данные (int64?), и создайте другой набор свойств, чтобы виртуализировать этот столбец так, как вы хотите (TimeSpan.FromMilliseconds?).

Я уже пытался добавлять что-то в свои объекты класса, однако, поскольку я использую DevExpress, мне нужен объект DataColumn, а не свойство для каждой строки, иначе я не смогу сопоставить свои значения с элементом управления, который я использование (использование несвязанных столбцов невозможно, так как для элемента управления требуется этот конкретный столбец).

RegularNormalDayGuy 05.01.2021 19:48

Я не уверен, что полностью понимаю, о чем вы говорите, но в равной степени я не уверен, почему вы не можете закодировать то, что вам нужно, чтобы предоставить то, что вы говорите, что хотите? Я продемонстрировал добавление свойства в строку, но вы, кажется, говорите, что вам нужен столбец; это добавляет свойство к другому объекту (класс данных, а не класс данных)

Caius Jard 05.01.2021 20:37

Другие вопросы по теме