#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)