日期的ADO记录集类型

时间:2014-06-02 18:21:49

标签: sql-server types asp-classic adodb recordset

警告:经典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返回?

在这种情况下,可能无法将数据库字段从日期更改为日期时间,即使它可能是获取预期数据的逻辑路径。

3 个答案:

答案 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]