c# -如何检索SQL Server时间(7)到TimeSpan
本文关键字:时间 Server TimeSpan SQL 检索 何检索 | 更新日期: 2023-09-27 18:14:11
我试图了解如何从定义为Time(7)
的SQL Server 2012表列检索时间数据。我找遍了所有地方,并为此挣扎。这里是一些简单的代码,我正在使用,只是试图让它工作。你能帮帮我吗?
当下面的代码运行时(使用Visual Studio 2013),我得到TimeSpan DBStartTime...
行上的错误:
无法强制转换"System"类型的对象。时间跨度'到类型'System.IConvertible'
我不知道如何解决这个问题。
var cnnString = ConfigurationManager.ConnectionStrings["TaktBoardsConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(cnnString);
SqlCommand comm = new SqlCommand();
comm.CommandText = "SELECT * FROM ScheduleDetail WHERE ScheduleID = " + lstShifts.SelectedValue;
comm.CommandType = CommandType.Text;
comm.Connection = conn;
SqlDataReader reader;
conn.Open();
reader = comm.ExecuteReader();
while (reader.Read())
{
TimeSpan DBStartTime = Convert.ToDateTime(reader["StartTime"]).TimeOfDay;
TimeSpan DBEndTime = Convert.ToDateTime(reader["EndTime"]).TimeOfDay;
// Add more coding once this works.
}
conn.Close();
不要使用Convert.ToDateTime
阅读器已经返回一个时间跨度,只是做一个直接cast
TimeSpan DBStartTime = (TimeSpan)reader["StartTime"];
TimeSpan DBEndTime = (TimeSpan)reader["EndTime"];
同样,与您的问题无关,但是您没有使用ScheduleID = " + lstShifts.SelectedValue;
的参数,您真的应该这样做。也不是你使用using
语句,当你的代码抛出一个异常,你没有得到你的连接对象关闭。
var cnnString = ConfigurationManager.ConnectionStrings["TaktBoardsConnectionString"].ConnectionString;
using(SqlConnection conn = new SqlConnection(cnnString))
using(SqlCommand comm = new SqlCommand())
{
comm.CommandText = "SELECT * FROM ScheduleDetail WHERE ScheduleID = @ScheduleID";
comm.Parameters.Add("@ScheduleID", SqlDbType.Int).Value = lstShifts.SelectedValue;
comm.CommandType = CommandType.Text;
comm.Connection = conn;
conn.Open();
using(SqlDataReader reader = comm.ExecuteReader())
{
while (reader.Read())
{
TimeSpan DBStartTime = (TimeSpan)reader["StartTime"];
TimeSpan DBEndTime = (TimeSpan)reader["EndTime"];
// Add more coding once this works.
}
}
}
我认为你没有理解什么是DateTime和TimeSpanDateTime是一天中的特定时间,例如7月4日晚上8点其中TimeSpan是持续时间,如9小时
因为如果这样,如果你做"7月4日晚上8点"-"7月4日下午3点",你将得到一个5小时的时间跨度,因此,如果你直接从数据库时间7点转换为日期时间,你将得到"1月1日晚上7点",这是完全无用的。直接选择timespan不过在这种情况下你会受到一些限制因为timespan不是Convert中的默认转换类型所以你需要使用旧的转换方式使用括号
if(reader["EndTime"] is TimeSpan)
DBEndTime = (TimeSpan)reader["EndTime"];