2009-09-22 9 views
1

J'ai une colonne XML typée dans laquelle je stocke la sérialisation à partir d'un objet C# avec une propriété DateTime. Que dateTime est de type local lorsque je le stocke dans la base de données - bien que le fichier XML sérialisé affiche l'heure avec un décalage à l'heure GT, comme dans '2009-09-22T13: 52: 32.2346252-07: 00' (j'habite dans Oregon). Lorsque je lis la table (à partir de SQL Management Studio), le fichier XML affiche l'objet DateTime dans le type UTC. Existe-t-il un moyen de contrôler ce comportement? Il est important pour moi de respecter le fuseau horaire des données que je mets, car cela peut provenir de différentes sources, et je dois respecter cela lorsque je le retire. Je ne veux pas non plus convertir chaque champ de date UTC en local après avoir lu les objets de la base de données.Colonne XML typée avec l'élément DateTime - DateTime est convertie

c'est la définition C# de l'objet I magasin:

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

Telle est la définition de la table (simplifiée pour plus de clarté)

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] 

Voici comment mon sproc ressemble (aussi simplifiée)

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

je dois faire 2 choses différemment:

  1. Je veux contrôler le format de la chaîne de date dans le fichier XML sérialisé - Je préfère un format ISO pour cette chaîne de temps
  2. Je ne veux pas DateTime être converti en UTC quand I Stockez-le dans la base de données, mais j'aimerais le garder en tant que champ DateTime .

Comment faire cela? Toute idée, pointeur, lien vers le blog d'un dieu montrant mes erreurs, etc. serait très apprécié.

Répondre

0

Est-ce une option pour utiliser DateTimeOffset au lieu de DateTime?

+0

Pas dans ce cas. Voir mon commentaire à moose ci-dessus –

1

Pas la plus propre façon de le faire, mais vous pouvez faire quelque chose comme ceci:

[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); } 
    } 
} 

Aussi, jetez un oeil à XmlAttributeOverrides classe - plus de travail, mais plus propre.

+0

J'ai regardé cette solution et a décidé de ne pas le faire - trop de classes où cela serait nécessaire. J'ai fini par dériver de IXmlSerializable, et convertir le format d'heure d'UTC dans la méthode Read(). –

Questions connexes