【问题标题】:export entire excel sheet to sql table with VBA使用VBA将整个excel表导出到sql表
【发布时间】:2017-07-07 23:17:50
【问题描述】:

将整个工作表发送到 sql 表时出现问题。我尝试了 2 种不同的方法,如下所示。两者都以不同的方式工作。最终我正在努力将多行数据导出到 sql DB

第一种方法我可以通过单击按钮成功将多行导入sql表,唯一的问题是StartTime和FinishTime以00:00:00进入sql表,即使我在excel中输入正常时间

Sub Button1_Click()
  Dim conn As New ADODB.Connection
  Dim iRowNo As Integer
  Dim sEventDate, sID, sDeptCode, sOpCode, sStartTime, sFinishTime, sUnits  As String

  With Sheets("Sheet1")
    'Open a connection to SQL Server
    conn.Open "Provider=SQLOLEDB;Data Source=db\db1;Initial Catalog=PTW;Integrated Security=SSPI;"
    'Skip the header row
    iRowNo = 2
    'Loop until empty cell in FirstName
    Do Until .Cells(iRowNo, 1) = ""
    sEventDate = .Cells(iRowNo, 1)
    sID = .Cells(iRowNo, 2)
    sDeptCode = .Cells(iRowNo, 3)
    sOpCode = .Cells(iRowNo, 4)
    sStartTime = .Cells(iRowNo, 5).Text
    sFinishTime = .Cells(iRowNo, 6).Text
    sUnits = .Cells(iRowNo, 7)
    'Generate and execute sql statement to import the excel rows to SQL Server table
    conn.Execute "insert into dbo.TimeLog (EventDate, ID, DeptCode, Opcode, StartTime, FinishTime, Units) values ('" & sEventDate & "', '" & sID & "', '" & sDeptCode & "', '" & sOpCode & "', cast('" & dStartTime & "' as datetime), cast('" & dFinishTime & "' as datetime), '" & sUnits & "')"

    iRowNo = iRowNo + 1

    Loop

    MsgBox "Data Successfully Exported."
    conn.Close
    Set conn = Nothing
  End With
End Sub

这第二种方式有效并完全按照它在 excel 表中的方式发送 StartTime 和 FinishTime,但它只允许我一次将一行发送到 sql 表

Sub Button1_Click()
  Dim conn As ADODB.Connection
  Dim cmd As ADODB.Command
  Dim strSQL As String

  strSQL = "INSERT INTO dbo.TimeLog" & _
     "(EventDate, ID, DeptCode, Opcode, StartTime, FinishTime, Units) " & _
     "VALUES (?,?,?,?,?,?,?)"

Set conn = New ADODB.Connection
  conn.Open "Provider=SQLOLEDB;Data Source=db\db1;Initial Catalog=PTW;Integrated Security=SSPI;"

iRowNo = 1

Set cmd = New ADODB.Command

  cmd.ActiveConnection = conn
  cmd.CommandType = adCmdText
  cmd.CommandText = strSQL



With Sheets("Sheet1")
  'Loop until empty cell in FirstName
   Do Until .Cells(iRowNo, 1) = ""

  cmd.Parameters.Append _
    cmd.CreateParameter("pEventDate", adVarChar, adParamInput, 8, .Cells(iRowNo, 1))
  cmd.Parameters.Append _
    cmd.CreateParameter("pID", adInteger, adParamInput, , .Cells(iRowNo, 2))
  cmd.Parameters.Append _
    cmd.CreateParameter("pDeptCode", adVarChar, adParamInput, 2, .Cells(iRowNo, 3))
  cmd.Parameters.Append _
    cmd.CreateParameter("pOpCode", adVarChar, adParamInput, 2, .Cells(iRowNo, 4))
  cmd.Parameters.Append _
    cmd.CreateParameter("pStartTime", adDBTime, adParamInput, 0, .Cells(iRowNo, 5))
  cmd.Parameters.Append _
    cmd.CreateParameter("pFinishTime", adDBTime, adParamInput, 0, .Cells(iRowNo, 6))
  cmd.Parameters.Append _
    cmd.CreateParameter("pUnits", adInteger, adParamInput, , .Cells(iRowNo, 7))

  cmd.Execute


  iRowNo = iRowNo + 1
  Loop

  MsgBox "Data Successfully Exported"

End With

  conn.Close
  Set conn = Nothing
End Sub

【问题讨论】:

    标签: sql-server vba excel


    【解决方案1】:

    您必须转换该值。在mssql中,你的时间值被识别为字符串。

    cast('8:00:00' as datetime)

    conn.Execute "insert into dbo.TimeLog (EventDate, ID, DeptCode, Opcode, StartTime, FinishTime, Units) values ('" & sEventDate & "', '" & sID & "', '" & sDeptCode & "', '" & sOpCode & "', cast('" & dStartTime & "' as datetime), cast('" & dFinishTime & "' as datetime), '" & sUnits & "')"
    

    【讨论】:

    • 我仍然以00:00:00 的身份将时间发送到SQL 表我什至尝试过这个,它仍然发送零conn.Execute "insert into dbo.TimeLog (EventDate, ID, DeptCode, Opcode, StartTime, FinishTime, Units) values ('" & sEventDate & "', '" & sID & "', '" & sDeptCode & "', '" & sOpCode & "', cast('" & dStartTime & "' as time(0)), cast('" & dFinishTime & "' as time(0)), '" & sUnits & "')"
    • 测试 .Cells(iRowNo, 6).text
    • 在添加Test.Cells(iRowNo, 6).Text 时出现错误但是,如果我不添加Test 而只添加.Text 它是成功的,但我仍在发送00:00:00
    • 也刚刚更新了反映您迄今为止所有建议的脚本
    【解决方案2】:

    在第一个脚本的循环中添加这个是我正在寻找的结果......

        Set cmd = New ADODB.Command
        cmd.ActiveConnection = conn
        cmd.CommandType = adCmdText
        cmd.CommandText = strSQL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2021-02-25
      • 2013-04-16
      • 2020-09-01
      相关资源
      最近更新 更多