警告:经典ASP未来。 :)
我正在研究传统的经典ASP应用程序,并且我遇到了一个带有ADODB.Recordset对象的奇怪现象。
我有一个包含特定字段的SQL2012数据库表。我们称之为 AnnoyingField 。它在SQL中的数据类型是'date'。
ASP打开一个ADODB.Recordset,在表上有一个SELECT来收集字段,然后做一些循环来完成它的工作:
For each Field in rs.Fields
typeid = rs(Field.Name).Type
'do stuff based on type
出于某种原因, AnnoyingField 的类型将返回202(nvarchar),而不是日期(133或甚至7)的预期类型之一。这导致代码中的一些问题。
我使用'datetime'类型的另一个字段进行了测试,Recordset代码返回了datetime字段的预期类型.135。
任何人都知道为什么'date'字段作为nvarchar返回?
在这种情况下,可能无法将数据库字段从日期更改为日期时间,即使它可能是获取预期数据的逻辑路径。
答案 0 :(得分:4)
日期字段比您的ADODB版本新。所以它不明白它会得到什么。
您可以使用
加油 select convert(datetime, AnnoyingField) from CrazyFuturisticTable
如果将ADODB版本升级到2.8和/或使用SQL Native Client进行连接,也可能会得到正确的结果。显然,我没有尝试过,因为我住在2014年。
答案 1 :(得分:1)
如果你更简单一点,将ADO从图片中删除并使用isdate和"转换日期"和vartype。
For each Field in rs.Fields
Field=rs(Field.Name)
if isdate(Field) then Field=cdate(Field) ' just in case
typeid = VarType(Field)
'do stuff based on type
VARTYPE http://www.w3schools.com/vbscript/func_vartype.asp
ADO .type可以报告更多"类型" http://www.w3schools.com/ado/prop_para_type.asp
但我认为vartype可以提供的应该可以帮助95%的人。
使用cdate警告,取决于服务器区域设置的设置或您的Session.LCID(在您的代码中)已设置将确定日期格式化的格式。对大多数人来说不应该是一个问题,但显然要测试你是否得到了预期的结果。
答案 2 :(得分:0)
我正在使用Classic ASP / VBScript并且发现SQL2012使用SQL Native驱动程序(" Provider = SQLNCLI11"),以及Windows提供的ADO模块(可能是Vista或更新版本[我的是Windows Servr2012] R2 - 版本[MyDbConn.version]显示为6.3)现在再次运行。
我一直在寻找/期待Field.Type为adDate [7],但实际上是在获取adDBDate [133]