Frage

Ich brauche eine Zeit in einer Datenbankspalte versetzt speichern (zum Beispiel 12.25, nur die Zeit, kein Datum).

Ich mag die schönen Daten visuellen Modellierungsfunktionen in Visual Studio 2008 verwenden dbml und den Code zu gehen mit ihm zu erzeugen. Die Datenbank ist SQL Server 2005.

Seit einer Zeitspanne ist im Wesentlichen ein Int64 (aka lang) die Anzahl der Ticks enthält, habe ich versucht, in der Datenbank so lange zu speichern.

Wenn ich aber fest, dass die Spalte an eine Eigenschaft vom Typ Timespan Karte sollte, Visual Studio Berichte:

  

Achtung: Das benutzerdefinierte Tool 'MSLinqToSQLGenerator' ist fehlgeschlagen. Unbekannter Fehler

Um dies zu umgehen ich die Datenbank Wert auf eine interne Eigenschaft zugeordnet habe, und ich habe eine partielle Klasse hinzugefügt, die Eigenschaftenaccessoren implementiert, die den Integer-Wert aus der Datenbank zu Span und zurück konvertieren.

Gibt es eine Möglichkeit, den richtigen Code zu ermöglichen, für dieses Objekt erzeugt werden? Oder gibt es eine bessere Möglichkeit, einen Zeitraum in einer SQL Server 2005-Datenbank zu speichern, die einen leichteren Zugang mit dbml erlaubt?

War es hilfreich?

Lösung

Auch vor diesem Problem einige Zeit konfrontiert.

Wie ich verstand es keine direkte Auflösung mit SQL Server 2005, so habe ich einen Trick:

gibt es Duration Spalte (die sollte eigentlich eine .NET TimeStamp Datentyp speichern) in der Datenbank des Typs BigInt NOT NULL. Hier ist dbml Definition:

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

Ich habe diese Klasse Eigenschaft als protected bedeutet, die will ich nicht den Benutzer meiner Klasse Zugriff dieses Objekt direkt und public Wrapper für diese Eigenschaft in Teilklasse gemacht:

    #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

So ist der Benutzer meiner Klasse hat eine einfach zu bedienende Eigenschaft statt einer Menge long Conversions TimeSpan.

Hope, das hilft.

Andere Tipps

Ich habe versucht, dies zu tun, bevor, mit epischen Ausfällen. Ich fand, dass, obwohl ich nicht das Datum Teil des Datetime in der Datenbank, entdeckte ich, dass das gesamte Datum und Uhrzeit in die Datenbank einreichen mir erlaubt, alle Funktionen mit der Zeit zu schaffen, die ich brauchte.

Sie kann den ToShortTimeString () verwenden, nur die Zeit in der Anwendung angezeigt werden soll. Nachdem das vollständige Datum mit der Zeit kann Ihnen Echtzeitberechnungen tun, wenn Sie jemals tun müssen, dass, wie die Zeitspanne zwischen einer Startzeit bestimmen und der Zeit zu stoppen. Da die mit der Zeitspanne beteiligt Zecken enthalten das Datum, sollte es keinen Grund geben, um die zusätzliche Mühe durchlaufen, um nur die Zeit in der Datenbank zu speichern.

Ich weiß, das ist nicht wirklich das, was Sie erhofft haben, aber wahrscheinlich die einfachste Lösung für Ihre Bedürfnisse, und das kommt von Stunden von meinem Kopf Erfahrung hämmerte bei dem Versuch, das Gleiche zu tun.

Sie können den Timespan-Datentyp auf den Datentyp ‚Time‘ Sql Karte (also unangenehme Fragen der Umsetzung zu vermeiden). Allerdings müssen folgende Voraussetzungen erfüllt sein:

  1. Ihre Code-Basis muss ausgeführt werden, auf .NET 3.5 sp1
  2. Die SQL-Datenbank muss laufen auf SQL 2008 (TIME Datentyp ist nur im Jahr 2008 verfügbar).

Zur Klarstellung lesen Sie: http://msdn.microsoft.com/en-us/library/bb882662. aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top