Pergunta

Eu preciso armazenar um deslocamento em uma coluna de banco de dados de tempo (por exemplo, 12:25 AM, apenas o tempo, sem data).

Eu gostaria de usar os dados agradáveis ??capacidades de modelagem visual no Visual Studio 2008 para gerar dbml eo código para ir com ele. O banco de dados é o SQL Server 2005.

Uma vez que um TimeSpan é essencialmente um Int64 (aka longa) contendo o número de tiques, tentei armazenar tanto tempo no banco de dados.

Se, no entanto I especificar que a coluna deve mapear uma propriedade do tipo TimeSpan, relatórios do Visual Studio:

Aviso: A ferramenta personalizada 'MSLinqToSQLGenerator' falhou. Erro não especificado

Para contornar este I mapeou o valor base de dados para uma propriedade interna e eu adicionei uma classe parcial que acessores implementos propriedade que convertem o valor inteiro do banco de dados para TimeSpan e volta.

Existe uma maneira de permitir que o código correto a ser gerado para esta propriedade? Ou há melhor maneira de armazenar um período de tempo em um banco de dados SQLServer 2005, que permite um acesso mais fácil usando dbml?

Foi útil?

Solução

Também enfrentou este problema há algum tempo.

Como eu entendi não há nenhuma resolução direto com SQL Server 2005, então eu usei um truque:

há coluna Duration (que, na verdade, deve armazenar um tipo de dados .NET TimeStamp) na base de dados de tipo BigInt NOT NULL. Aqui está a definição dbml:

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

Eu definir essa propriedade de classe como protected que significa que eu não quero que o usuário do meu acesso de classe este bem directamente e fez um invólucro public para esta propriedade na classe parcial:

    #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

Assim, o usuário da minha classe tem uma propriedade fácil de usar, em vez de um monte de long às conversões TimeSpan.

Hope, isso ajuda.

Outras dicas

Eu tentei fazer isso antes, com falhas épicos. Descobri que mesmo que eu não estou usando a parte Data do DateTime no banco de dados, descobri que a apresentação de toda a data e hora para o banco de dados permitiu-me para fornecer toda a funcionalidade com o tempo que eu precisava.

Você pode usar o ToShortTimeString () para exibir apenas o tempo em sua aplicação. Ter a data completa-se com o tempo permite que você faça verdadeiros cálculos de tempo se você já precisou fazer isso, como determinar o período de tempo entre a hora de início e parada. Porque os carrapatos envolvido com o intervalo de tempo incluir a data, não deve haver nenhuma razão para passar pela dificuldade extra para armazenar apenas o tempo no banco de dados.

Eu sei que isso não é realmente o que você estava esperando, mas provavelmente a solução mais fácil para as suas necessidades, e isso vem de horas de bater minha cabeça experiência em tentar fazer a mesma coisa.

Você pode mapear o tipo de dados TimeSpan para o tipo de dados SQL 'Time' (evitando assim quaisquer problemas de implementação desagradáveis). No entanto, os seguintes requisitos devem ser atendidos:

  1. A sua base de código deve ser executado em NET 3.5 SP1
  2. O banco de dados SQL must estar em execução no SQL Server 2008 (o tempo tipo de dados está disponível apenas em 2008).

Para esclarecimento ler este: http://msdn.microsoft.com/en-us/library/bb882662. aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top