Question

Je dois stocker un décalage dans une colonne de base de données (par exemple, 00h25, juste le temps, pas de date).

Je voudrais utiliser les données belle capacités de modélisation visuelle dans Visual Studio 2008 pour générer dbml et le code pour aller avec elle. La base de données est Sql Server 2005.

Depuis un TimeSpan est essentiellement un Int64 (alias long) contenant le nombre de tiques, j'ai essayé de stocker aussi longtemps dans la base de données.

Si toutefois je précise que la colonne doit mapper une propriété de type TimeSpan, rapports Visual Studio:

  

Attention: L'outil personnalisé 'MSLinqToSQLGenerator' a échoué. Erreur non spécifiée

Pour contourner cela, je l'ai cartographié la valeur de base de données à une propriété interne et j'ai ajouté une classe partielle qui implémente accesseurs de propriété qui convertissent la valeur entière de la base de données TimeSpan et retour.

Y at-il un moyen de permettre le bon code à générer pour cette propriété? Ou est-il une meilleure façon de stocker une plage temporelle dans une base de données SqlServer 2005 qui permet d'accéder plus facilement à l'aide dbml?

Était-ce utile?

La solution

En outre face à ce problème il y a quelque temps.

Comme je l'ai compris il n'y a pas de solution directe avec SQL Server 2005, donc j'utilisé une astuce:

il y a colonne Duration (qui devrait effectivement stocker un type de données .NET TimeStamp) dans la base de données de type BigInt NOT NULL. Voici la définition dbml:

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

Je mets cette propriété de classe qui signifie que je protected ne veux pas que l'utilisateur de mon accès de classe cette propriété directement et fait un wrapper pour cette public propriété en classe partielle:

    #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

Ainsi, l'utilisateur de ma classe a une propriété facile à utiliser au lieu d'un grand nombre de conversions long à TimeSpan.

L'espoir, cela aide.

Autres conseils

J'ai essayé de le faire avant, avec les échecs épiques. Je trouve que même si je ne suis pas en utilisant la partie Date de la DateTime dans la base de données, j'ai découvert que la présentation de la toute date et l'heure de la base de données m'a permis de fournir toutes les fonctionnalités avec le temps nécessaire.

Vous pouvez utiliser le ToShortTimeString () pour afficher juste le temps dans votre application. Avoir la date complète avec le temps vous permet de faire des calculs de temps vrai si vous avez toujours besoin de le faire, par exemple déterminer le laps de temps entre un temps de démarrage et d'arrêt. Du fait que les tiques impliquées dans l'intervalle de temps comprennent la date, il devrait y avoir aucune raison de passer par la peine supplémentaire pour stocker tout le temps dans la base de données.

Je sais que ce n'est pas vraiment ce que vous espériez, mais probablement la meilleure solution pour vos besoins, et cela vient des heures de frapper mon expérience de la tête en essayant de faire la même chose.

Vous pouvez mapper le type de données TimeSpan du type de données « Time » Sql (évitant ainsi les problèmes de mise en œuvre désagréables). Toutefois, les conditions suivantes doivent être remplies:

  1. Votre code de base doit être en cours d'exécution sur .Net 3.5 sp1
  2. La base de données Sql doit être en cours d'exécution sur SQL Server 2008 (TIME type de données est seulement disponible en 2008).

Pour plus de précisions lire ceci: http://msdn.microsoft.com/en-us/library/bb882662. aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top