Отображение значения базы данных в TimeSpan с использованием dbml - PullRequest
1 голос
/ 12 мая 2009

Мне нужно сохранить смещение времени в столбце базы данных (например, 12:25, просто время, без даты).

Я хотел бы использовать прекрасные возможности визуального моделирования данных в Visual Studio 2008 для генерации dbml и кода, который идет вместе с ним. База данных Sql Server 2005.

Поскольку TimeSpan - это, по сути, Int64 (он же long), содержащий количество тиков, я попытался сохранить это длинное в базе данных.

Однако, если я укажу, что столбец должен соответствовать свойству типа TimeSpan, Visual Studio сообщает:

Предупреждение: пользовательский инструмент «MSLinqToSQLGenerator» не работает. Неуказанная ошибка

Чтобы обойти это, я сопоставил значение базы данных с внутренним свойством и добавил частичный класс, который реализует методы доступа к свойствам, которые преобразуют целочисленное значение из базы данных в TimeSpan и обратно.

Есть ли способ включить правильный код для этого свойства? Или есть лучший способ сохранить временную шкалу в базе данных SqlServer 2005, которая упрощает доступ с помощью dbml?

Ответы [ 3 ]

4 голосов
/ 19 марта 2010

Также столкнулся с этой проблемой некоторое время назад.

Как я понял, прямого разрешения с SQL Server 2005 нет, поэтому я использовал трюк:

В базе данных типа BigInt NOT NULL есть столбец Duration (который фактически должен хранить тип данных .NET TimeStamp). Вот определение dbml:

<Column Name="Duration" 
    Member="DurationInternal" 
    AccessModifier="Protected" 
    Type="System.Int64" 
    DbType="BigInt NOT NULL" 
    CanBeNull="false" />

Я установил это свойство класса как protected, что означает, что я не хочу, чтобы пользователь моего класса обращался к этому свойству напрямую, и создал оболочку public для этого свойства в частичном классе:

    #region Properties
    /// <summary>
    /// Gets or sets the audio duration.
    /// </summary>
    /// <value>The duration.</value>
    public TimeSpan Duration
    {
        get
        {
            return TimeSpan.FromTicks(this.DurationInternal);
        }
        set
        {
            this.DurationInternal = value.Ticks;
        }
    }
    #endregion

Таким образом, у пользователя моего класса есть простое в использовании свойство вместо большого количества преобразований long в TimeSpan.

Надеюсь, это поможет.

3 голосов
/ 12 мая 2009

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

Вы можете использовать ToShortTimeString () для отображения только времени в вашем приложении. Наличие полной даты вместе со временем позволяет вам выполнять вычисления истинного времени, если вам когда-либо понадобится это сделать, например, определить временной интервал между временем начала и времени окончания. Поскольку отметки, связанные с промежутком времени, включают в себя дату, не должно быть причин проходить лишние хлопоты, чтобы просто сохранить время в базе данных.

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

1 голос
/ 22 октября 2009

Вы можете сопоставить тип данных TimeSpan с типом данных Sql 'Time' (что позволяет избежать любых неприятных проблем с реализацией). Однако должны быть выполнены следующие требования:

  1. Ваша кодовая база должна быть запущена на .Net 3.5 sp1
  2. База данных Sql должна работать на Sql 2008 (ВРЕМЯ тип данных доступен только в 2008 году).

Для уточнения прочитайте это: http://msdn.microsoft.com/en-us/library/bb882662.aspx

...