Pergunta

Estou lendo um resultado de uma MS SQL Server 2008 banco de dados com um tipo de coluna de dbtype.time de um datareader, usando c # com DAAB quadro 4.0.

Meu problema é a documentação do MSDN diz dbtype.time deve mapear para um período de tempo, mas a única perto construtor para timespan vejo aceita um longo, eo resultado retornado do datareader não pode ser convertido para um longo, ou diretamente para um período de tempo .

Eu encontrei este artigo whichs mostra datareader.getTimeSpan () método, mas o datareader em DAAB 4.0 não parecem ter este método.

Então, como faço para converter o resultado do datareader a um objeto timespan?

Foi útil?

Solução

GetTimeSpan é um método de OleDbDataReader e SqlDataReader (mas não da interface IDataReader mais genérico que de DAAB ExecuteReader retornos). Estou assumindo que a instância IDataReader que DAAB voltou para você é realmente uma instância de SqlDataReader. Isso permite que você acessar o método GetTimeSpan lançando a instância IDataReader appropiately:

using (IDataReader dr = db.ExecuteReader(command))
{
    /* ... your code ... */
    if (dr is SqlDataReader)
    {
        TimeSpan myTimeSpan = ((SqlDataReader)dr).GetTimeSpan(columnIndex)
    }
    else
    {
        throw new Exception("The DataReader is not a SqlDataReader")
    }
    /* ... your code ... */
}

Edit:. Se a instância IDataReader não é um SqlDataReader então você pode estar faltando o atributo provider de sua cadeia de conexão definida no seu app.config (ou web.config)

Outras dicas

Você já tentou um elenco direta como este?

TimeSpan span = (TimeSpan)reader["timeField"];

Eu só testei isso rapidamente na minha máquina e funciona bem quando "TimeField" é um tipo de dados Tempo no banco de dados (SQL).

Aqui é a minha opinião:


using (IDataReader reader = db.ExecuteReader(command))
{
    var timeSpan = reader.GetDateTime(index).TimeOfDay;
}

Cleaner, talvez!

O que é o tipo .NET do valor da coluna? Se for um DateTime em seguida, você pode passar o valor de sua propriedade Carrapatos (longo) para o construtor TimeSpan. Por exemplo.

var span = new TimeSpan(colValue.Ticks);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top