У меня есть типизированный объект набора данных, который извлекает таблицу из моей базы данных sql-сервера. Насколько я знаю, sql-server не поддерживает тип TimeSpan
. Как мне добавить этот новый столбец в мой код С#?
На данный момент у меня есть столбец, который содержит тики, поэтому в базе данных я буду хранить количество тиков, которое затем будет преобразовано в TimeSpan и наоборот (TimeSpan будет редактироваться в приложении и будет затем преобразуются в тики, которые затем помещаются в базу данных). Моя проблема в том, что, поскольку это типизированная база данных, которая будет использоваться вместе с элементом управления DevExpress (элемент управления Ганта), я не знаю, как добавить новый столбец TimeSpan и использовать его?
Единственное решение, которое я вижу, это создать новую таблицу данных на основе первой, скопировать в нее данные, работать с ней, и как только пользователь захочет обновить, вернуть ее в мой типизированный набор данных и использовать sprocs для внесения изменений, а затем вернуться , но это не похоже на лучшее решение... Есть идеи?
Вот код, который я использую для создания нового свойства в моей строке, проблема в том, что я не вижу свой столбец.
public TimeSpan TimeSpanDuration
{
get => IsDurationNull() ? new TimeSpan(Duration) : TimeSpan.Zero;
set => Duration= value.Ticks;
}
Ничто не мешает вам добавлять свойства в типизированный набор данных; в конце концов, это всего лишь то, что сделала для вас визуальная студия. Откройте свой набор данных, дважды щелкните таблицу данных, и вы перенесетесь в представление кода с предварительно заполненным 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
, а не свойство для каждой строки, иначе я не смогу сопоставить свои значения с элементом управления, который я использование (использование несвязанных столбцов невозможно, так как для элемента управления требуется этот конкретный столбец).