C# 调用SqlDataReader.GetTimeSpan()或.GetDateTime()时发生无效的强制转换异常
我的ASP.NET MVC应用程序有一个小问题。 在我的类Repository.cs中,我称之为StoredProcedure,它给了我类似的东西:C# 调用SqlDataReader.GetTimeSpan()或.GetDateTime()时发生无效的强制转换异常,c#,asp.net,sqldatareader,C#,Asp.net,Sqldatareader,我的ASP.NET MVC应用程序有一个小问题。 在我的类Repository.cs中,我称之为StoredProcedure,它给了我类似的东西: ############################################################### | JOB | STATUS | DATE | START | END | DURATION | ###############################################
###############################################################
| 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:如果是视图,请更改视图或不使用它,而是使用原始表。