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

#c# #sql-server #dataset #strongly-typed-dataset

#c# #sql-сервер #набор данных #строго типизированный-dataset

Вопрос:

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

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

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

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

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

 

Ответ №1:

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

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

         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 собственный столбец в моем собственном коде (не делайте этого в файле конструктора — он будет потерян — сделайте это в файле, в который вы были перенесены, когда вы дважды щелкнули datatable в конструкторе), который имеет свойство типа:

         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 .От миллисекунд?)

Комментарии:

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

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