如何使SqlDataReader获得时间(7)类型变量

本文关键字:类型变量 时间 何使 SqlDataReader | 更新日期: 2023-09-27 18:02:49

我有一个这样的SQL Server表:

userID int
xCoordinate int
yCoordinate int
recordTime time(7)
itemId int

我想获得给定用户(现在假设是用户1)的所有记录时间。我使用了以下代码:

public static void something()
{
    string stmt = "select * from GazeTable where id = " + 1 + " ;";
    SqlConnection conn = GetConnection();
    SqlCommand cmd = new SqlCommand(stmt, conn);
    conn.Open();
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine(reader.GetDateTime(3));
        }
    }
    conn.Close();
}

但是会抛出错误

类型为"System"的未处理异常。InvalidCastException' occurred in System.Data.dll

表示该赋值无效。

如何以("HH:mm:ss.ffff")的形式打印表中每个recordTime的时间?

如何使SqlDataReader获得时间(7)类型变量

SQL类型Time(7)相当于c#类型TimeSpan而不是DateTime,要获得DateTime值,SQL类型必须为datetime

所以只需将代码改为TimeSpan而不是DateTime:

public static void something()
{
   string stmt = "select * from GazeTable where id = " + 1 + " ;";
   SqlConnection conn = GetConnection();
   SqlCommand cmd = new SqlCommand(stmt, conn);
   conn.Open();
   using (var reader = cmd.ExecuteReader())
   {
      while (reader.Read())
      {
         Console.WriteLine(reader.GetTimeSpan(3));
      }
   }
   conn.Close();
}

在我的脑海中,您可能需要使用这样的东西(尚未测试):

    public static void something()
    {
        string stmt = "select * from GazeTable where id = " + 1 + " ;";
        SqlConnection conn = GetConnection();
        SqlCommand cmd = new SqlCommand(stmt, conn);
        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            if (reader.HasRows)
            {
                while (reader.Read())
                {
                    Console.WriteLine("{0}", ((SqlDataReader)reader).GetTimeSpan(3).ToString(@"dd'.hh':mm':ss':ff"));
                }
            }
            else
            {
                Console.WriteLine("No rows found.");
            }
        }
        conn.Close();
    }

应该将time(7)列转换为时间跨度,不能直接转换为日期时间