【问题标题】:VBScript unaltered Date and Time for database migration用于数据库迁移的 VBScript 未更改日期和时间
【发布时间】:2019-08-02 23:28:23
【问题描述】:

我正在进行从 MSSQL 到 MySQL 的数据迁移。我的日期/时间值正是它在两个数据库中的需要。但是,VBScript 会转换它(默认情况下):

2016-01-06 10:26:30.363

对此(INSERT 上的错误):

1/6/2016 10:26:30 AM

我知道我可以使用 Year()、Month() 等再次构造该值。有人知道如何使用 VBScript 从数据库中获取此日期/时间值不变吗?

更新:根据“显示我的代码”评论,这里有一个部分:

strSQL = "SELECT * FROM Users"
Set objRS = CreateObject("ADODB.RecordSet") 
objRS.Open strSQL, objConn,3,3

Do While Not objRS.EOF

    sUserId = objRS("UserId")
    sCreatedDate = objRS("CreatedDate") '<-- At this point, it's "converted" already
    wscript.echo sCreatedDate      '<-- This displays 1/6/2016 10:26:30 AM format

    insertSQL = "INSERT INTO northwind.usersetting (UserId,CreatedDate) "
    insertSQL = insertSQL & "VALUES ('"&sUserId&"','"&sCreatedDate &"');"

    objConn2.Execute = (insertSQL)

objRS.MoveNext
Loop

只是您的标准 vbscript。我想我可以在 MSSQL 中解决这个问题,但 MySQL 不喜欢它。与此同时,我已经这样做以解决这个问题:

Function FormatDate4Insert(date)
    FormatDate4Insert = Year(date) & "-" & Month(date) & "-" & Day(date) & " " & Hour(date) & ":" & Minute(date) & ":" & Second(date)
End Function

我很想直接进行非转换,但无论我做什么,vbs 似乎都会转换。我尝试转换为字符串和其他一些没有乐趣的东西......

附:我不确定您所说的数据库导入导出机制是什么意思。但是,我尝试了 MySQL 迁移工具以及导出和导入机制(到 csv ......具有不同的分隔符等......甚至是 json 导出,使用 Notepad++ 和 Excel 等按摩数据)并且无法获得数据与我的选择性导入有关。在大多数情况下,我可以毫无问题地迁移整个数据库,但只想从单个表中获取数据。当我浪费太多时间时,我通常会退回到 vbscript 或任何有意义的脚本。

我发现这两个数据库在某些方面都更加宽容和挑剔。但是,使用 MSSQL 到 MySQL,我必须将空值转换为“NULL”,将 True/False 转换为它们的位值(例如 b'0')以及脚本编写更容易的其他小调整(至少对我而言)。

更新 2:请求的错误:

用于 ODBC 驱动程序的 Microsoft OLE DB 提供程序:[MySQL][ODBC 8.0(w) 驱动程序][mysqld-8.0.16]不正确的日期时间值:'1/6/2016 10:26:30 AM' 对于第 1 行的“CreatedDate”列。

我无法重现另一个错误,但我也遇到了与此类似的错误:

错误:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 接近 '1/6/2016 10:26:30 AM'

这是对插入语句的引用。

【问题讨论】:

  • 如果您使用数据库导出和导入机制,VBScript 根本不应该接触数据。请出示您的代码。
  • 不要做你正在做的事情。 Export 将数据作为 CSV 来自 SQL Server,import 将该 CSV 导入 MySQL。仅当您需要在导入前对 CSV 进行调整时才使用 VBScript。
  • @AnsgarWiechers 正如我上面提到的,这就是我尝试过的(两天),但无法让数据在两个数据库之间移动。删除了几列并添加了几列。但是,我基本上没有这样做的想法。此外,以 json 格式导入会表示所有内容均已成功导入,然后在下一个屏幕上显示“0 条记录已导入”。我想我可以针对导入时遇到的错误提出另一个 SO 问题,但我基本上已经完成了我需要做的事情。

标签: vbscript


【解决方案1】:

尝试参数化查询:

    ' *** ADO ***
    '---- CommandTypeEnum Values ----
    Const adCmdText = &H0001

    '---- DataTypeEnum Values ----
    Const adInteger = 3
    Const adDate = 7

    '---- ParameterDirectionEnum Values ----
    Const adParamInput = &H0001

    Dim cmd
    Dim sSQL

    Set cmd = CreateObject("ADODB.Command")
    Set cmd.ActiveConnection = cn   ' Assumes cn is an actice ADOB.Connection object
    cmd.CommandType = adCmdText

    sSQL = "INSERT INTO northwind.usersetting (UserId, CreatedDate) VALUES (?, ?);"

    cmd.CommandText = sSQL

    Set prm = cmd.CreateParameter("UserId", adInteger, adParamInput, , UserId)  ' Assuming UserId is a integer, adjust as needed
    cmd.Parameters.Append prm

    Set prm = cmd.CreateParameter("CreatedDate", adDate, adParamInput, , CreatedDate)
    cmd.Parameters.Append prm

    cmd.Execute , , adExecuteNoRecords

[已添加]

尝试以下 sn-p 以确保 MySQL 接受日期值:

Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = cn   ' Assumes cn is an actice ADOB.Connection object
cmd.CommandType = adCmdText

sSQL = "INSERT INTO northwind.usersetting (CreatedDate) VALUES (?);"

cmd.CommandText = sSQL

Set prm = cmd.CreateParameter("CreatedDate", adDate, adParamInput, , Now())
cmd.Parameters.Append prm

cmd.Execute , , adExecuteNoRecords

如果这可行,那么您可能想在我发布的第一个示例中尝试以下行:

Set prm = cmd.CreateParameter("CreatedDate", adDate, adParamInput, , CDate(CreatedDate))

注意使用 CDate() 进行的显式日期转换。

第一个代码 sn-p 顶部的 ADO 常量取自 Microsoft 分发的名为 adovbs.inc 的文件。不幸的是,快速搜索并没有从 MS 下载。但这里是a gist 及其内容。向下滚动到'---- DataTypeEnum Values ----。还有一些其他与日期相关的常量,例如Const adDBDate = 133。您可以尝试一下,看看它是否会产生预期的结果。

[添加 2 个]

' *** ADO ***
'---- CommandTypeEnum Values ----
Const adCmdText = &H0001

'---- DataTypeEnum Values ----
Const adInteger = 3
Const adDate = 7

'---- ParameterDirectionEnum Values ----
Const adParamInput = &H0001


Dim strSQL
Dim cmd, rs


Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = cnMSSQL   ' Assumes cnMSSQL is an actice ADOB.Connection object connected to the MS SQL server
cmd.CommandType = adCmdText

' Fill the recordset from a command object connecting to the source MS SQL
strSQL = "SELECT * FROM Users"
cmd.CommandText = strSQL
Set rs = cmd.Execute()

' Now use the Command object to fill the MySQL DB
Set cmd.ActiveConnection = cnMySQL  ' ' Assumes cnMySQL is an actice ADOB.Connection object connected to the MySQL server
strSQL = "INSERT INTO northwind.usersetting (UserId, CreatedDate) VALUES (?, ?);"
cmd.CommandText = strSQL

Do While Not rs.EOF

    ' This assumes that the columns in source MS SQL also are named 'UserId' and 'CreateDate'.
    ' Adjust the rs.Fields("UserId").Value and rs.Fields("CreateDate").Value as needed

    Set prm = cmd.CreateParameter("UserId", adInteger, adParamInput, , rs.Fields("UserId").Value)  ' Assuming UserId is a integer, adjust as needed
    cmd.Parameters.Append prm

    Set prm = cmd.CreateParameter("CreatedDate", adDate, adParamInput, , rs.Fields("CreateDate").Value)
    cmd.Parameters.Append prm

    cmd.Execute , , adExecuteNoRecords  

    ' Clear/reset the parameter collection

    rs.MoveNext

Loop

【讨论】:

  • 谢谢,这似乎是针对INSERT 部分,而问题似乎在于检索数据,因为它在到达您的位置时已经“转换”为不需要的格式部分代码。因此,当我执行wscript.echo prm.Value 时,它会返回1/6/2016 10:26:30 AM. 此外,我尝试使用ADO 检索(即SELECT)数据,并且仍然获得1/6/2016 10:26:30 AM 格式。
  • 不要被日期数据类型的 visual 输出所迷惑。它使用您的语言环境设置来确定格式,例如my 机器上的MsgBox Now() 生成29.07.2019 16:00:07,这是正确的本地化日期格式。另外:参数化查询适用于任何 SQL 语句。要检索结果,只需将 cmd.Execute 更改为 Set rs = cmd.Execute()
  • 这很有趣。我永远不会想到这一点。但是,看来你是对的。当我做MsgBox Now() 时,我得到了不想要的格式。那么,这些语言环境设置在哪里可以更改它以使其表现得像您的一样?你的后一个陈述基本上是我所做的,没有去,因为它每次都将这种不需要的格式输入到 INSERT 语句中(即我可以在错误消息中看到它并且一直是问题)。因此,我的计算机对该数据的可视化表示似乎是实际尝试的内容......
  • 好的,只是为了确保:两个数据库中的列都是日期数据类型?如果是这样,哪些。我问,因为日期数据类型本身没有“格式”。您所看到的始终只是 的视觉表示。例如。 VB6/VBA 中的Date 数据类型实际上是Double,整数代表日期部分,小数位代表时间部分。您还提到了一条错误消息,您可以用它更新您的 OP 吗?
  • 是的,两者都是日期类型。 MSSQL = 日期时间... MySQL = DATETIME(6)。我会用错误更新我原来的问题。
猜你喜欢
  • 1970-01-01
  • 2018-03-22
  • 2015-06-15
  • 1970-01-01
  • 2015-10-11
  • 2014-02-19
  • 2019-11-18
  • 2013-03-15
  • 2017-05-26
相关资源
最近更新 更多