2009-05-12 1 views
1

データベースの列に時間オフセットを格納する必要があります(たとえば、午前12時25分、時間だけ、日付なし)。dbmlを使用したTimeSpanへのデータベース値のマッピング

Visual Studio 2008の素敵なデータビジュアルモデリング機能を使用して、dbmlとそのコードを生成したいと考えています。データベースはSQL Server 2005です。

TimeSpanは本質的にティック数を含むInt64(別名long)なので、データベースにその長さを格納しようとしました。

警告:

しかし、私は列が型のTimeSpan、Visual Studioのレポートのプロパティにマップする必要があることを指定した場合

カスタムツール「MSLinqToSQLGeneratorは」失敗しました。指定されていないエラー

この問題を回避するために、データベースの値を内部プロパティにマップし、整数値をデータベースからTimeSpanに変換して戻すプロパティアクセサを実装する部分クラスを追加しました。

このプロパティに対して正しいコードを生成する方法はありますか?または、dbmlを使用して簡単にアクセスできるSqlServer 2005データベースにタイムパンを格納する方が良い方法はありますか?

+0

ちょっと不思議なことに、なぜあなたはその日をデータベースに保存していないのですか? SQL 2005では、時間だけの格納はサポートされていません。 – CodeLikeBeaker

+0

私のアプリケーションには、毎日特定の時間に発生するアクティビティを含む毎日のスケジュールが含まれています。したがって、日付は関連性がなく、ちょうど時間です。 –

答えて

4

また、いくつかの時間前にこの問題に直面しました。

IがSQL Server 2005とは直接解像度がないので、私はトリックを使用理解されるように:

タイプBigInt NOT NULLのデータベースに(実際.NET TimeStampデータ型を格納する必要があり)Durationカラムがあります。ここDBML定義は次のとおりです。

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

私はこのプロパティを直接私のクラスへのアクセスをユーザーにしたくないわけprotectedとして、このクラスのプロパティを設定し、部分クラスで、このプロパティのpublicラッパーを作っ:

#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 

私のクラスのユーザーはlongからTimeSpanまでの多くの変換ではなく、使いやすいプロパティを持っています。

希望、これは役立ちます。

+0

これは私があまりにも終わったものです。 xoxoの答えに私のコメントを参照してください。 –

3

私はこれまでに、叙事詩の失敗でこれをやろうとしました。私は、データベースのDateTimeのDate部分を使用していないにもかかわらず、DateとTimeをデータベースに提出すると、必要なTimeをすべての機能に提供できることがわかりました。

ToShortTimeString()を使用すると、アプリケーションの時刻だけを表示できます。時間の完全な日付を持つことで、開始時間と終了時間の間の時間間隔を決定するなど、これまで必要だった場合に真の時間計算を行うことができます。タイムスパンに関連するティックには日付が含まれているため、データベースに時間を保存するだけの余計なトラブルはありません。

これは本当にあなたが望んでいたものではないが、おそらくあなたのニーズに最も簡単な解決策であると知っています。これは、同じことをやろうとして頭の中で経験した時間からです。

+0

私はトラブルの最初の兆候を見ています。ちょうどTimeSpanをフォーマットしようとしました。それはすでに痛みです... http://stackoverflow.com/questions/574881/how-can-i-string-format-a-timespan-object-with-a-custom-format-in-net –

1

TimeSpanデータ型をSql 'Time'データ型にマップすることができます(したがって、実装上の問題は避けてください)。

  1. あなたのコードベースは、SQLデータベースが SQL 2008上で実行されている必要があり .NET 3.5 SP1
  2. 上で実行している必要があります(TIME データ型は、2008年にのみ使用可能です):次の要件が満たされなければならないが 。

明確にするため、これを読んで:http://msdn.microsoft.com/en-us/library/bb882662.aspx

+0

実際には、何私は整数値としてTimeSpanの値を格納していました。 .NETはInt64値(Ticks)を使用してTimeSpanとDateTimeの両方の値を格納します。これは、SQLで日付と時刻の関数を使用することはできませんが、TimeSpanの列を並べ替えることができます。追加のボーナスとして、.NET DateTime/TimeSpanとSQLServer datetimeの間の解決の違いを処理します。 –

関連する問題