VB6 ADO命令以美国格式而不是英语插入日期

时间:2013-04-16 04:47:40

标签: ms-access vb6 ado datetime2

我有一个VB6遗留程序,它一直在悄悄地将Now()日期转换为美国格式,即2013年8月4日将2013年8月4日插入Access数据库,但2013年3月23日没问题。这种情况自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

有没有人遇到这个,现在为什么会发生这种情况?

由于

1 个答案:

答案 0 :(得分:1)

我使用问题中提供的代码重新创建您的问题是不成功的。我试过了

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

  • 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日,无论日期格式的区域设置如何。