带有DateTime元素的类型化XML列 - 转换DateTime

时间:2009-09-22 21:07:15

标签: c# sql xml

我有一个类型化的XML列,其中我使用DateTime属性存储C#对象的序列化。当我将它存储在数据库中时,该DateTime是本地类型 - 尽管序列化的XML显示了与GT时间偏移的时间,如 '2009-09-22T13:52:32.2346252-07:00'(我住在俄勒冈州)。 当我读取表(来自SQL Management Studio)时,XML以UTC类型显示DateTime对象。 有没有办法控制这种行为?对我来说,尊重我输入的数据的时区非常重要,因为它可能来自不同的来源,当我把它拉出来时,我需要尊重它。 在从DB读取对象后,我也不想将每个日期时间字段从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]

这就是我的sproc的样子(也简化了)

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

我需要做两件事:

  1. 我想控制序列化XML中日期字符串的格式 - 我更喜欢那个时间字符串的ISO格式
  2. 我不希望DateTime在转换为UTC时 我将它存储在数据库中,但我希望将它保存为数据库 DateTime字段。
  3. 我该怎么做?任何想法,指针,链接到一些上帝的博客显示我的错误等...将非常感激。

2 个答案:

答案 0 :(得分:1)

不是最干净的方法,但你可以这样做:

[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课程 - 更多工作,但更清洁。

答案 1 :(得分:0)

是否可以选择使用DateTimeOffset而不是DateTime?