1

我需要在数据库列中存储时间偏移量(例如,12:25 AM,只是时间,没有日期)。

我想使用 Visual Studio 2008 中出色的数据可视化建模功能来生成 dbml 和与之配套的代码。数据库是 Sql Server 2005。

由于 TimeSpan 本质上是一个包含刻度数的 Int64(又名 long),因此我尝试将其存储在数据库中。

但是,如果我指定该列应映射到 TimeSpan 类型的属性,Visual Studio 报告:

警告:自定义工具“MSLinqToSQLGenerator”失败。未指定的错误

为了解决这个问题,我将数据库值映射到一个内部属性,并添加了一个部分类,该类实现了将整数值从数据库转换为 TimeSpan 并返回的属性访问器。

有没有办法为此属性生成正确的代码?或者有没有更好的方法将时间跨度存储在 SqlServer 2005 数据库中,以便使用 dbml 更轻松地访问?

4

3 回答 3

4

前段时间也遇到过这个问题。

据我了解,没有直接的解决方案SQL Server 2005,所以我使用了一个技巧:

类型的数据库中有Duration列(实际上应该存储 .NETTimeStamp数据类型)BigInt NOT NULL。这是 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

希望这可以帮助。

于 2010-03-19T10:40:38.000 回答
3

我以前尝试过这样做,但失败了。我发现即使我没有在数据库中使用 DateTime 的 Date 部分,我发现将整个 Date 和 Time 提交到数据库允许我提供所需的时间的所有功能。

您可以使用 ToShortTimeString() 仅显示应用程序中的时间。如果需要,将完整日期与时间结合起来可以让您进行真正的时间计算,例如确定开始时间和停止时间之间的时间跨度。因为与时间跨度有关的滴答包括日期,所以没有理由费心将时间存储在数据库中。

我知道这并不是您真正希望的,但可能是满足您需求的最简单的解决方案,这来自于我在尝试做同样的事情时的数小时撞击经验。

于 2009-05-12T15:37:20.827 回答
1

您可以将 TimeSpan 数据类型映射到 Sql 'Time' 数据类型(从而避免任何讨厌的实现问题)。但是必须满足以下要求:

  1. 您的代码库必须在 .Net 3.5 sp1 上运行
  2. Sql 数据库必须在 Sql 2008 上运行(TIME 数据类型仅在 2008 中可用)。

为了澄清,请阅读:http: //msdn.microsoft.com/en-us/library/bb882662.aspx

于 2009-10-22T09:18:50.317 回答