1

我有一个 VB6 遗留程序,它一直在悄悄地将 Now() 日期转换为美国格式,即 2013 年 8 月 4 日作为 2013 年 8 月 4 日插入 Access 数据库,但 23/3/2013 很好。这种情况自 2002 年以来一直在发生,但直到现在还没有人注意到。大多数更新是在月底完成的。

如果我提取过程并在虚拟程序中运行它,它工作正常。但是在应用程序代码的某个地方,某些东西正在说服 ADO 尝试转换日期。

它在 ADO 命令中完成,日期设置为 DateTimeStamp 参数

eg
strSQL = "Insert into TSCDATA " _
                & " ( FID, FNAME, FPID, FCREATEDATE, FLNKEDTDATE, FSIZE)" _
                & " values ( ? , ? , ? , ? , ? , ? ) "
with mADOCmdInsert
    .Name = CMD_INSERT
    .CommandText = strSQL
    .CommandType = adCmdText
    .ActiveConnection = m_conn
    .Prepared = False
    .Parameters.Append .CreateParameter(prID, adInteger, adParamInput)
    .Parameters.Append .CreateParameter(prNAME, adChar, adParamInput, 16)
    .Parameters.Append .CreateParameter(prFPID, adInteger, adParamInput)
    .Parameters.Append .CreateParameter(prFCREATEDATE, adDBTimeStamp, adParamInput)
    .Parameters.Append .CreateParameter(prFLNKEDTDATE, adChar, adParamInput, 8)
    .Parameters.Append .CreateParameter(prFSIZE, adChar, adParamInput, 8)    
End With

模块的其他地方:

dteNow = Now

With mADOCmdInsertScorpat
    .Parameters(prID).Value = lngId
    .Parameters(prNAME).Value = txtName
    .Parameters(prFPID).Value = VersionId
    .Parameters(prFCREATEDATE).Value = dteNow
    .Parameters(prFLNKEDTDATE).Value = ""
    .Parameters(prFSIZE).Value = txtSize

    .Execute lngRecsAffected
End With

以前有没有人遇到过这种情况,现在为什么会这样?

谢谢

4

1 回答 1

1

我未能使用问题中提供的代码重新创建您的问题。我试过了

  • Windows 控制面板中区域设置的各种组合:“英语(澳大利亚)”、“英语(加拿大)”、“英语(英国)”、“英语(美国)”,以及

  • OLEDB 和 ODBC 连接,以及

  • 我什至将虚拟机中的系统时钟回溯到 4 月 2 日,看看这是否Now()奇怪。

在每种情况下,ADO 参数化查询都插入了正确的日期。

我的建议是在代码的其余部分中搜索将日期文字直接传递给 Jet 的流氓 INSERT 或 UPDATE 语句。我很确定,对于任何形式的陈述......

INSERT INTO TSCDATA (FCCREATEDATE) VALUES (#2/04/2013 6:43:19 AM#)

...由以下内容(在澳大利亚)生产...

"INSERT INTO TSCDATA (FCCREATEDATE) VALUES (#" & CStr(Now) & "#)"

...Jet将始终将日期解释为 2 月 4 日而不是 4 月 2 日,无论日期格式的区域设置如何。

于 2013-04-16T10:36:41.253 回答