【问题标题】:Import VBScript General Date Time Into MS Access Date/Time Column将 VBScript 通用日期时间导入 MS Access 日期/时间列
【发布时间】:2009-01-13 17:02:18
【问题描述】:

设置

我有一个用于驱动 Web 服务压力测试的 VBScript。该脚本创建一个测量数据文件,每条记录都带有一个通用日期/时间的时间戳:

FormatDateTime(Now(), 0)

这会创建类似的日期

mm/dd/yyyy hh:mm:ss [AM|PM]

我需要将此数据文件导入 MS-Access 2003 数据库。 Access 数据库中的表有一个名为TimeStamp 的列,其数据类型为Date/Time,格式为General Date

我的导入规范有一个名为 Timestamp 的字段,其日期类型为 Date/Time。在Dates, Times, and Numbers 框架中,选择了以下选项:

Date Order: MDY
Date Delimiter: /
Time Delimiter: :
Four Digit Years: Checked

数据文件以制表符分隔,第一行中的字段名称。

问题

当我导入我的数据文件时,时间戳字段中的每条记录都失败,并出现 Type Conversion Failure 错误。

问题

有没有办法按原样导入数据,还是我必须先将时间戳字段“按摩”为 24 小时日期/时间格式?如果是后者,有没有办法在我的 VBScript 代码中格式化时间戳,以 24 小时格式写入日期/时间?我试过了

FormatDateTime(Now(), "mm/dd/yyyy hh:mm:ss")

但 VBScript 对此感到不满。

【问题讨论】:

  • 您是从 VBScript 中填写日期字段,还是将日期写入文件并将其导入数据库?
  • VBScript 正在将数据写入平面文件(制表符分隔)并为每条记录添加时间戳。由于文件中有 450,000 多条记录,我想导入 Access 以进行过滤、查询和分析。

标签: ms-access vbscript import


【解决方案1】:

VBScripts FormatDateTime 函数不支持通用格式字符串,仅支持一组受约束的常量,而 0 是您必须同时包含日期和时间的唯一选择。

会不会是 AM/PM 的出现导致了混乱?

您在美国地区?

试试SetLocale(2057)

这会将脚本放入 en-GB(英国)语言环境。默认日期时间格式为 dd/mm/yyyy hh:mm:ss。它的 24 小时也许您的导入会更喜欢这种格式。

【讨论】:

    【解决方案2】:

    为什么不跳过数据文件,直接将结果写入数据库呢?

    编辑: 或者使用此脚本将数据从文件移动到数据库。

    
    Set DataFile = CreateObject("Scripting.FileSystemObject").OpenTextFile("FileName",1)
    
    Set objConnection = CreateObject("ADODB.Connection")
    objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=database.mdb"
    
    Set objRecordset = CreateObject("ADODB.Recordset")
    objRecordset.CursorLocation = 3
    objRecordset.Open "SELECT * FROM TableName" , objConnection, 3, 3
    
    Do Until DataFile.AtEndOfStream
        arrTemp = Split(DataFile.ReadLine, vbTab)
        If IsArray(arrTemp) Then
            objRecordset.AddNew
            objRecordset("FieldName1") = arrTemp(0)
            objRecordset("FieldName2") = arrTemp(1)
            objRecordset("FieldName3") = arrTemp(2)
            objRecordset.Update
        Else
            'Only one item of data is on this line
        End If 
    Loop 
    
    DataFile.Close
    objConnection.Close
    Set DataFile = Nothing
    Set objRecordset = Nothing
    Set objConnection = Nothing 
    

    【讨论】:

    • 这是一个想法,但需要对我继承的脚本进行一些大范围的手术。也许从长远来看......
    【解决方案3】:

    来自这个link;我可以模仿 VB 的 Format() 函数将日期格式化为 24 小时日期/时间:

    Function Format(vExpression, sFormat) 
    
        set fmt = CreateObject("MSSTDFMT.StdDataFormat") 
        fmt.Format = sFormat 
    
        set rs = CreateObject("ADODB.Recordset") 
        rs.Fields.Append "fldExpression", 12 ' adVariant 
    
        rs.Open 
        rs.AddNew 
    
        set rs("fldExpression").DataFormat = fmt 
        rs("fldExpression").Value = vExpression 
    
        Format = rs("fldExpression").Value 
    
        rs.close: Set rs = Nothing: Set fmt = Nothing 
    
    End Function
    

    来自文章:

    MSSTDFMT 对象依赖于 MSSTDFMT.dll 的可用性,即 由 Visual Studio 6.0 安装。

    MSSTDFMT.dll 似乎在 Windows XP 和 Windows 2003 服务器上可用;我检查了几台从未安装过 MS Visual Studio 并且存在 DLL 的机器。

    我更改了我的 VBScript 代码以使用此函数将日期置于 Access 可以导入的格式中:

    Format(Now(), "mm/dd/yyyy hh:mm:ss")
    

    【讨论】:

    • 优秀。无论如何,我仍然认为您应该以 ISO 格式导入,而不是使用本地日期格式 - MS 因在有歧义时会出错而臭名昭著。
    • 不幸的是,无论该列如何定义,Access 在导入时似乎都无法识别 ISO 日期。
    【解决方案4】:

    我不知道这是否会有所帮助,但是您有什么方法可以在您的 VBScript 中处理您的日期输出,以确保日期具有前导零和 4 位数年份?如果你这样做,那么你可以将它作为文本字段导入然后处理它,因为你会知道前 10 个字符是明确的日期,然后你可以通过一些数据按摩来解析时间。如果这是不可能的,但您知道日期和时间之间有一个空格,那么您可以再次导入为文本并使用空格作为分隔符从时间解析日期,然后处理时间字段。

    我知道您说过您不想在导入后解析数据,但如果您无法将导入数据转换为 Access 可以处理的格式,那么您别无选择。

    另一个想法:

    您是否尝试过 Excel 的导入功能?它可能表面上类似于 Access 导入,但它通常会在完全相同的数据上为您提供完全不同的结果。

    很抱歉,我无法提供任何确定的信息。

    【讨论】:

      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多