C# 调用SqlDataReader.GetTimeSpan()或.GetDateTime()时发生无效的强制转换异常

C# 调用SqlDataReader.GetTimeSpan()或.GetDateTime()时发生无效的强制转换异常,c#,asp.net,sqldatareader,C#,Asp.net,Sqldatareader,我的ASP.NET MVC应用程序有一个小问题。 在我的类Repository.cs中,我称之为StoredProcedure,它给了我类似的东西: ############################################################### | JOB | STATUS | DATE | START | END | DURATION | ###############################################

我的ASP.NET MVC应用程序有一个小问题。 在我的类Repository.cs中,我称之为StoredProcedure,它给了我类似的东西:

###############################################################
| JOB  | STATUS | DATE       | START    | END      | DURATION |
###############################################################
| ABCD | ok     | 05.05.2015 | 10:15:12 | 10:16:00 | 00:00:48 |
. 
.
.
public class Job
{
    public string JobName { get; set; }

    public JobStatus Status { get; set; }

    public DateTime Appointment { get; set; }

    public TimeSpan Start { get; set; }

    public TimeSpan End { get; set; }

    public TimeSpan Duration { get; set; }

}
My Repository.cs类代码看起来像rdr是一个SqlDataReader:

while (rdr.Read())
{
    var jobNameId = rdr.GetOrdinal("JOB");
    var statusId = rdr.GetOrdinal("STATUS");
    var appointmentId = rdr.GetOrdinal("DATE");
    var startId = rdr.GetOrdinal("START");
    var endId = rdr.GetOrdinal("END");
    var durationId = rdr.GetOrdinal("DURATION");

    result.Add(new Job()
    {
        JobName = rdr.GetString(jobNameId),
        Status = (JobStatus)Enum.Parse(typeof(JobStatus), rdr.GetString(statusId)),
        // rdr.GetDateTime() and rdr.GetTimeSpan() is throwing InvalidCastException
        Appointment = rdr.GetDateTime(appointmentId),
        Start = rdr.GetTimeSpan(startId),
        End = rdr.GetTimeSpan(endId),
        Duration = rdr.GetTimeSpan(durationId)
    });
}
我的Job.cs课程看起来是这样的:

###############################################################
| JOB  | STATUS | DATE       | START    | END      | DURATION |
###############################################################
| ABCD | ok     | 05.05.2015 | 10:15:12 | 10:16:00 | 00:00:48 |
. 
.
.
public class Job
{
    public string JobName { get; set; }

    public JobStatus Status { get; set; }

    public DateTime Appointment { get; set; }

    public TimeSpan Start { get; set; }

    public TimeSpan End { get; set; }

    public TimeSpan Duration { get; set; }

}
当我的读取器rdr尝试调用rdr.getDateTimeAppointId时,以及当它调用rdr.GetTimeSpanstartId | endId | durationId时,会引发异常

我知道我可以用Convert.ToDateTimerdr.GetStringAppointId来完成,但我不想这样做,因为这对我来说没有意义


你们知道我如何获得DateTime/TimeSpan,而不显式地将其转换为DateTime/TimeSpan吗?

数据库或存储过程中的模式是什么?@JonSkeet存储过程从视图中获取元素,这个视图只有varchar值我知道我可以用Convert.ToDateTimerdr.GetStringAppointId来实现,但我不想这样做,因为这对我来说没有意义。你不能这样做,因为它们不是字符串,或者你可以这样做,然后你应该更改数据库中的类型。将varchar用于datetime或time是没有意义的。这也解决了“残疾卡斯特例外”的问题。我想这就是问题所在。如果存储过程要返回日期/时间值,它应该这样做…@brothers28:如果是视图,请更改视图或不使用它,而是使用原始表。