c#列数据类型日期类型(NOT DateTime)

时间:2010-04-15 14:52:55

标签: c# sql

我想知道有没有很好的方法来检测日期字段(NOT DateTime)的列数据类型?

这就是我现在所做的:

switch (dt.Columns[col].DataType.FullName)
{  
    case "System.DateTime":  
        formatedVal = Formatter.GetDateTime(val);  
        break;

    // which is NOT possible, but something equivalent am looking for
    case "System.Date":  
        formatedVal = Formatter.GetDate(val);  
        break;

    default:
        formatedVal = val.ToString();
        break;
}

5 个答案:

答案 0 :(得分:7)

不。没有Date类型,只有DateTime。如果这来自使用date列的SQL Server 2008表,则它将映射到.​​NET中的DateTime

如果您需要获取此信息,那么您必须在SQL级别执行此操作;当它被加载到DataTable时,为时已晚。

我对你的要求并不满意,但看起来你可能只需要检查午夜并使用不同的格式就可以逃脱:

DateTime dt = (DateTime)val;
return (dt == dt.Date) ? Formatter.GetDate(dt) : Formatter.GetDateTime(dt);

答案 1 :(得分:1)

答案 2 :(得分:1)

我使用了稍微不同的方法来解决同样的问题

switch (dt.Columns[col].DataType.FullName)
{
    case "System.DateTime":
        formatedVal = ((DateTime)dataRow[col]).ToString("d");
        break;

    case "System.Date":
        formatedVal = ((DateTime)dataRow[col]).ToString();
        break;

    default:
        formatedVal = dataRow[col].ToString();
        break;
}

答案 3 :(得分:0)

如果您使用SqlDataReader,则可以调用GetSchemaTable,这样您就可以访问每列的基础SQL Server数据类型 - 它在该链接的MSDN参考中返回的架构信息的完整列表。如果您确实需要获取基础SQL Server架构,那么这就是一种方法。

SqlDataAdapter确实有FillSchema方法,但我认为它实际上并没有为您提供基础数据库类型。

答案 4 :(得分:0)

实际上,“Date”是CLR中的内置数据类型,尽管现在标记为“过时”。 IDE甚至没有显示它......

无论如何,在任何情况下,当你想要kwnow一个对象的类型时,我认为obj.GetType()。Name不是最好的方法,因为当你真正想知道是否一个时,你最终会比较字符串obj是ceratin类型。

我会去

if (dt.Columns[col] is DateTime)
.....
else
  if (dt.Columns[col] is Date) 
   ... 

我只是展示了执行数据类型检查的另一种方法。你说自己,不可能与“日期”比较。