我想知道有没有很好的方法来检测日期字段(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;
}
答案 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)
DateTime.ToString是灵活的http://msdn.microsoft.com/library/zdtaw1bw.aspx
答案 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)
...
我只是展示了执行数据类型检查的另一种方法。你说自己,不可能与“日期”比较。