C# C-如何将SQL Server时间(7)检索到TimeSpan中

C# C-如何将SQL Server时间(7)检索到TimeSpan中,c#,asp.net,sql-server,casting,timespan,C#,Asp.net,Sql Server,Casting,Timespan,我试图理解如何从定义为Time7的SQLServer2012表列中检索时间数据。我到处都找过,一直在努力解决这个问题。下面是一些简单的代码,我只是想用它来让它工作。你能帮帮我吗 当下面的代码使用Visual Studio 2013运行时,我在TimeSpan DBStartTime上收到错误。。。行: 无法将“System.TimeSpan”类型的对象强制转换为“System.IConvertible”类型 我不知道如何解决这个问题 var cnnString = ConfigurationMa

我试图理解如何从定义为Time7的SQLServer2012表列中检索时间数据。我到处都找过,一直在努力解决这个问题。下面是一些简单的代码,我只是想用它来让它工作。你能帮帮我吗

当下面的代码使用Visual Studio 2013运行时,我在TimeSpan DBStartTime上收到错误。。。行:

无法将“System.TimeSpan”类型的对象强制转换为“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读取器已返回Timespan,只需执行直接强制转换

    TimeSpan DBStartTime = (TimeSpan)reader["StartTime"];
    TimeSpan DBEndTime = (TimeSpan)reader["EndTime"];
另外,与您的问题无关,但您没有使用ScheduleID=+lstShifts.SelectedValue;,的参数;,你真的应该。您也不使用语句,当代码抛出异常时,您不会关闭连接对象

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.
        }
    }
}

我想你不明白什么是日期时间和时间跨度 日期时间是一天中的某个特定时间,即7月4日晚上8点 其中,时间跨度是一个持续时间,即9小时

因为如果你在7月4日晚上8点到7月4日下午3点这样做,你将得到5小时的时间跨度,因此如果你直接从7点的数据库时间转换为日期时间,你将在0001年1月1日得到7点,这是完全没有用的。相反,直接转到timespan,尽管在本例中,timespan不是Convert中的默认转换类型,这一事实稍微妨碍了您,因此您需要使用使用括号的旧式转换

if(reader["EndTime"] is TimeSpan)
    DBEndTime = (TimeSpan)reader["EndTime"];

你做的。使用以下代码解决此问题:cmd.Parameters.AddUserId,UserId.Text使用此查询从ScheduleDetail中选择*其中ScheduleID=?但是您必须使用@Hein,这不是正确的方法。@ScottChamberlain:为什么不使用?@Hein SQL Server提供程序不使用?它使用命名占位符。您应该使用eg@userId作为SQL语句中的参数名和参数名?用于OLEDB@Hein您正在使用的重载是SqlParameterCollection。添加方法字符串、对象,还需要使用@SomeName吗?对于Microsoft SQL。谢谢您Scott!!你不知道你现在解决了多少痛苦@PanagiotisKanavos在我完成输入之前,我在顶部点击submit来回应您的评论,我已经用参数表完成了。我以前使用过参数,但通常在插入中使用。你能用一个参数来建议你将我的代码改成什么吗?1它允许提高你的性能,2它为你提供额外的安全性并防止。现在,如果SelectedValue是一个int,就像我猜的那样,你可能是安全的,但是如果你使用一个参数,你知道你是安全的。@ScottChamberlain,我想澄清一点,我的理解是,你需要在非托管代码上使用语句,在这种情况下是SqlConnection类,其他2条using语句包含管理代码元素,因此只有在您没有直接访问SqlConnection的权限时才需要进行处理,因为using不关闭连接,只需断开if与对象图的连接,以便垃圾收集器识别其不再使用,然后GC将关闭连接。这不对吗?