типизированный столбец XML с элементом DateTime - DateTime преобразуется - PullRequest
1 голос
/ 23 сентября 2009

У меня есть типизированный столбец XML, в котором я храню сериализацию из объекта C # со свойством DateTime. Этот DateTime имеет локальный тип, когда я сохраняю его в БД, хотя в сериализованном XML-формате время показывается со смещением по времени GT, как в '2009-09-22T13: 52: 32.2346252-07: 00' (я живу в Орегоне). Когда я читаю таблицу (из SQL Management Studio), XML показывает объект DateTime в формате UTC. Есть ли способ контролировать это поведение? Для меня важно уважать часовой пояс данных, которые я ввел, поскольку они могут поступать из разных источников, и я должен это учитывать, когда извлекаю их. Я также не хочу преобразовывать каждое поле даты и времени из UTC в локальное после того, как я прочитал объекты из БД.

это определение C # объекта, который я храню:

[Serializable]
[XmlType(Namespace="urn://MySchema")]
public class MyObject
{
    public DateTime RecordTime { get; set; }
    // .. omitted for clarity
}

Это определение таблицы (упрощено для ясности)

CREATE TABLE MyTable(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [MyKey] [int] NULL,
    [TheObject] [xml](CONTENT [dbo].[MySchema]) NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,       ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Вот так выглядит мой росток (тоже упрощенно)

ALTER PROCEDURE [dbo].[SaveMyObjects] 
    @where int, 
    @object xml
AS
BEGIN
INSERT INTO MyTable
    (MyKey, TheObject)
    VALUES(@where, @object)
END

Мне нужно сделать 2 вещи по-разному:

  1. Я хочу контролировать формат строки даты в сериализованном XML - Я бы предпочел формат ISO для этой временной строки
  2. Я не хочу, чтобы DateTime конвертировался в UTC, когда Я храню это в БД, но я хотел бы удобство хранения как Поле DateTime.

Как мне это сделать? Буду очень признателен за любую идею, указатель, ссылку на блог какого-нибудь бога, показывающий мои ошибки и т. Д.

Ответы [ 2 ]

1 голос
/ 23 сентября 2009

Не самый чистый способ сделать это, но вы могли бы сделать что-то вроде этого:

[Serializable]
[XmlType(Namespace="urn://MySchema")]
public class MyObject
{
    [XmlIgnore]
    public DateTime RecordTime { get; set; }

    //property for serialization purposes
    [XmlElement(ElementName="RecordTime")]
    public string XmlRecordTime
    {
        get { return this.RecordTime.ToString("o"); }
        set { this.RecordTime = new DateTime.Parse(value); }
    }
}

Кроме того, взгляните на XmlAttributeOverrides class - больше работы, но чище.

0 голосов
/ 23 сентября 2009

Можно ли использовать DateTimeOffset вместо DateTime?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...