【问题标题】:ADO Recordset Type for Date日期的 ADO 记录集类型
【发布时间】:2018-06-03 20:03:59
【问题描述】:

警告:经典 ASP 提前。 :)

我正在开发一个传统的 Classic ASP 应用程序,但我遇到了一个 ADODB.Recordset 对象的奇怪问题。

我有一个包含特定字段的 SQL2012 数据库表。我们称之为 AnnoyingField。它在 SQL 中的数据类型是“日期”。

ASP 在表上打开一个带有 SELECT 的 ADODB.Recordset 以收集字段,然后执行一些循环来完成它的工作:

For each Field in rs.Fields
    typeid = rs(Field.Name).Type
    'do stuff based on type

出于某种原因,AnnoyingField 的类型返回为 202 (nvarchar),而不是日期的预期类型之一(133 甚至 7)。这导致代码中进一步出现一些问题。

我用另一个“日期时间”类型的字段进行了测试,记录集代码返回了日期时间字段的预期类型.. 135。

有人知道为什么“日期”字段会以 nvarchar 形式返回吗?

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

【问题讨论】:

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


    【解决方案1】:

    日期字段比您的 ADODB 版本新。所以它不明白它得到了什么。

    你也许可以通过使用来振作起来

     select convert(datetime, AnnoyingField) from CrazyFuturisticTable
    

    如果您将 ADODB 版本升级到 2.8 和/或使用 SQL Native Client 连接,您也可能会得到正确的结果。显然,我没有尝试过,因为我生活在 2014 年。

    【讨论】:

    • 我同意@podiluska。我什至可以制作一个视图来包装该表(并转换 Annoying 字段)。
    • ADODB.Connection 的 .Version 属性报告 6.1,但我认为您仍然是对的。今天早上,我发现了一张与 SQL 数据类型相关的 ADODB 类型图表,并且没有 7 或 133 的 SQL 等价物,只有 135。所以最后我将不得不硬着头皮在某个地方更改数据类型.
    • @imukai 这不是偶然的吗? Data Type Mapping,一直用着。
    • @imukai 您应该使用Provider=SQLNCLI10 来支持DATE 数据类型(正如podiluska 指出的那样),因为它仅在SQL Server 2008 及更高版本中引入。
    【解决方案2】:

    如果你让它更简单一点,从图片中删除 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
    

    变量类型 http://www.w3schools.com/vbscript/func_vartype.asp

    ADO .type 可以报告更多“类型” http://www.w3schools.com/ado/prop_para_type.asp

    但我认为 vartype 可以提供的功能应该在 95% 的情况下对人们有所帮助。

    cdate 的警告词,取决于服务器区域设置或您的 Session.LCID(在您的代码中)设置将确定日期将被格式化为什么格式。对大多数人来说应该不是问题,但显然要进行测试,看看您是否得到了预期的结果。

    【讨论】:

    • 感谢您的评论。如果“do stuff”都是只读的,这将起作用,但是有一个代码的更新部分会修改记录集,然后通过.update 保存它。在将日期字段设置为 = '' 的情况下,您最终会得到默认日期(1900 年?),这就是最初注意到问题的方式。我将不得不先将它们转换为日期时间,以便代码在更新之前将其反馈给日期或 NULL 而不是空字符串。
    • 你应该把这些信息放在问题中:)
    【解决方案3】:

    我正在使用 Classic ASP / VBScript,并且发现对于使用 SQL Native 驱动程序(“Provider=SQLNCLI11”)的 SQL2012,以及 Windows 提供的 ADO 模块(大概是 Vista 或更新的 [我的是 Windows Servr2012 R2 - 版本 [ MyDbConn.version] 显示为 6.3) 现在又可以使用了。

    我一直在寻找/期望 Field.Type 是 adDate [7],但实际上我得到的是 adDBDate [133]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多