Como converter Datareader Resultado da DbType.Time para Timespan objeto?
-
09-09-2019 - |
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?
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);