【问题标题】:typed XML column with DateTime element - DateTime gets converted带有 DateTime 元素的类型化 XML 列 - DateTime 被转换
【发布时间】:2009-09-22 21:07:15
【问题描述】:

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

我需要做两件不同的事情:

  1. 我想控制序列化 XML 中日期字符串的格式 - 我更喜欢那个时间字符串的 ISO 格式
  2. 我不希望将 DateTime 转换为 UTC 时 我将它存储在数据库中,但我希望方便地将其保存为 日期时间字段。

我该怎么做?任何想法、指针、指向某个上帝博客的链接显示我的错误等,将不胜感激。

【问题讨论】:

    标签: c# sql xml


    【解决方案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 类 - 更多的工作,但更清洁。

    【讨论】:

    • 我查看了该解决方案并决定不这样做 - 需要这样做的类太多。我最终从 IXmlSerializable 派生,并在 Read() 方法中从 UTC 转换时间格式。
    【解决方案2】:

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

    【讨论】:

    • 在这种情况下不是。请参阅我对驼鹿的评论
    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多