【问题标题】:CONVERSION FAILED WHEN CONVERTING DATA/OR time from character string VBA to SQL Server将数据/时间从字符串 VBA 转换为 SQL Server 时转换失败
【发布时间】:2020-07-01 09:19:33
【问题描述】:

我正在尝试将 Excel 文件上传到 SQL Server 表中,但出现此错误:

将字符串 VBA 中的数据/或时间转换为 SQL SERVER 时转换失败

我的源表有格式日期,我的目标表有格式日期。

我应该怎么做才能使这段代码工作

我正在尝试使用CDATE(),但它不起作用。

Private Sub EventData_Click()

Set conn = New ADODB.Connection
cs = "DRIVER=SQL SERVER;"
cs = cs & "DATABASE=MAGANG;"
cs = cs & "SERVER=FELIX"

conn.Open cs, "", ""

sqlcmd = "CREATE TABLE Event_Data(ID Varchar(255) PRIMARY KEY, EVENT Varchar(255),DATE DATE);"

On Error GoTo errormastertable
conn.Execute sqlcmd
conn.Close
Set conn = Nothing

errormastertable:

    Dim l_row As Long
   
    Dim s_ID As String
    Dim s_EVENT As String
    Dim s_DATE As Date
 
Set conn = New ADODB.Connection
cs = "DRIVER=SQL SERVER;"
cs = cs & "DATABASE=MAGANG;"
cs = cs & "SERVER=FELIX"

    With Workbooks("Event_Data").Sheets("4-Event_Data")

conn.Open cs, "", ""
        l_row = last_row_with_data(1, ActiveSheet)
   
    For i = 2 To l_row
   
        s_ID = .Cells(i, 1)
        s_EVENT = .Cells(i, 2)
        s_DATE = .Cells(i, 3)
                               
        sqlcmd = "insert into dbo.Event_Data (ID,EVENT,DATE) values ('" & s_ID & "', '" & s_EVENT & "', '" & s_DATE & "')"
        conn.Execute sqlcmd
         Next
          conn.Close
        Set conn = Nothing

    End With
   
    Workbooks("Event_Data").Close savechanges:=False
    End If

End Sub

【问题讨论】:

  • 参数化你的查询,问题就会消失
  • VBA, ADO.Connection and query parameters 是一个很好的起点
  • 如何将它应用到我的代码中?
  • 请查看 Larnu 提供的链接,它包含一个非常好的示例。如果您遇到困难,请随时提出新问题。

标签: sql-server excel vba


【解决方案1】:
  1. 数字通常没有符号
  2. 字符前后都有单引号
  3. 日期时间格式在数据前后加#前缀。

sqlcmd = "insert into dbo.Event_Data (ID,EVENT,DATE) values ('" & s_ID & "', '" & s_EVENT & "', '" & s_DATE & "')"

到(访问文件的情况下)

sqlcmd = "insert into dbo.Event_Data (ID,EVENT,DATE) values ('" & s_ID & "', '" & s_EVENT & "', #" & s_DATE & "#)"

但是(在 MSSQL 的情况下)

  sqlcmd = "insert into dbo.Event_Data (ID,EVENT,DATE) values ('" & s_ID & "', '" & s_EVENT & "', cast('" & s_DATE & "' as datetime) )"  

【讨论】:

  • 谢谢兄弟,但我的问题已经用这段代码解决了_date = Year(s_DATE) & "/" & PadLeft(Month(s_DATE), 2, "0") & "/" & PadLeft(Day(s_DATE), 2, "0")
  • @LixFelix,我的回答有点令人困惑。 mssql 需要将日期时间数据转换为另一种格式。更正了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多