ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1669|回复: 12

[求助] 批量导入多个CSV文件到SQL数据库代码出错,求高手帮忙修改。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-1-5 04:51 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助



写了一个目录下批量导入多个CSV文件到SQL数据库的VBA代码,运行老是出错,哪个高手能帮我解决吗?CSV文件很大,大概10万行数据,而且多个。还有更快导入到sql数据库的写法吗?


Sub 批量导入CSV文件到sql()
#If ProjectStatus = "DEV" Then
    ' needs reference for Microsoft ActiveX Data Objects
    Dim cn As ADODB.Connection
#Else ' assume PROD
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
#End If
    Dim strSQL As String
    Dim strConn As String
    Dim path As String, fnTemp As String
   
    Dim start As Double
    start = Timer()   '计算这个程序运行时间。
   
    On Error GoTo test_Error
   
    Dim fn, fp
    '关闭屏幕刷新
    Application.ScreenUpdating = False
      
    fp = ThisWorkbook.path
    fn = Dir(fp & "\*" & geshiC) '取得第一个工作簿的文件
    Dim wenjianming, wenjishuzu
    strConn = "Provider=sqloledb;Server=.;Database=test;Uid=sa;Pwd=sa;"
    cn.Open strConn
    wenjianming = ""
    Do While fn <> ""
        wenjishuzu = Split(fn)   '文件名默认中间空格隔开
        wenjianming = wenjishuzu(UBound(wenjishuzu))  '空格后面内容
        wenjianming = LCase(Replace(wenjianming, geshiC, ""))  '去掉格式后缀并小写,这里是数据库表名,表名对应文件的某个名称
        strSQL = "Insert Into dbo." & wenjianming & " Select 字段1,字段2,字段3, From [Text;FMT=Delimited;HDR=Yes;DATABASE=" & ThisWorkbook.path & "].[" & fn & "]"
        
        Debug.Print strSQL
        cn.Execute strSQL  
        fn = Dir() '取得下一个工作簿的文件名
    Loop '循环
    cn.Close
    Set cn = Nothing
   '打开屏幕刷新
    Application.ScreenUpdating = True
    fenzhong = Int(Format(Timer - start, "0.00") / 60)
    MsgBox "程序运行时间约是 " & fenzhong & " 分钟."
    On Error GoTo 0
    Exit Sub
     
test_Error:   
    MsgBox "strSQL=" & strSQL & Chr(10) & " Error " & Err.Number & " (" & Err.Description & ") 表格错误"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-5 05:17 | 显示全部楼层
const geshiC = “.csv” 常量忘记加上了 。还有大的csv文件有将近100万行。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-5 05:26 | 显示全部楼层
批量导入xls数据到sql数据库,我写成功没有问题,就是运行比较慢。问题是这个写法只支持XLS/XLSX格式的,不支持CSV格式的,或者哪个高手根据这个改成可以支持CSV格式的也行。注:csv文件大的有百万行,且有200个左右。

Sub 批量导入xls文件到sql()
   
#If ProjectStatus = "DEV" Then
    Dim cn As ADODB.Connection
#Else ' assume PROD
    Dim cn As Object
    Set cn = CreateObject("ADODB.Connection")
#End If
Const dizhi As String = "D:\数据\"    '这个路径名最后一定要有一个反斜杠 "\"
Const geshiC As String = ".csv"  
Const geshiX As String = ".xlsx"   '(如果是2007版,则后缀名请改为 *.xlsx)

    Dim strSQL As String
    Dim lngRecsAff As Long
    Dim Headers As Boolean
    Dim strConn As String
    Dim path As String, fnTemp As String
   
    Dim start As Double
    start = Timer()   '计算这个程序运行时间。
   
    On Error GoTo test_Error
   
   
    Dim fn, fp
    '关闭屏幕刷新
    Application.ScreenUpdating = False
      
    fp = dizhi
    fn = Dir(fp & "*" & geshiX) '取得第一个工作簿的文件名

    Do While fn <> ""
        Headers = True


        path = fp & fn
        fnTemp = Replace(fn, geshiX, "")
        strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";" & "Extended Properties=""Excel 8.0; IMEX=1;HDR=YES"""    '这条语句支持xls/xlsx格式文件,不支持CSV格式
        Debug.Print strConn
      
        cn.Open strConn
         
        
        strSQL = "Insert INTO [odbc;Driver={SQL Server};" & _
                 "Server=.;Database=数据库名;" & _
                 "UID=用户名;PWD=密码].表名 Select 字段一,字段二,字段三,字段四,字段五,字段六 FROM [" & fnTemp & "$] "

        
        Debug.Print strSQL
        cn.Execute strSQL, lngRecsAff
        Debug.Print "Records affected: " & lngRecsAff
     
        fn = Dir() '取得下一个工作簿的文件名
        cn.Close
   
    Loop '循环
    Set cn = Nothing

   '打开屏幕刷新
    Application.ScreenUpdating = True
    fenzhong = Int(Format(Timer - start, "0.00") / 60)
    MsgBox "程序运行时间约是 " & fenzhong & " 分钟."
    On Error GoTo 0
    Exit Sub
     
test_Error:
     
    MsgBox "strSQL=" & strSQL & Chr(10) & " Error " & Err.Number & " (" & Err.Description & ") in procedure test of VBA Document ThisWorkbook"
     
End Sub

TA的精华主题

TA的得分主题

发表于 2023-1-5 09:44 | 显示全部楼层
1、报错位置,报错内容,报错原因是什么?
2、我们联不上你的本地SQLserver数据库,请提供建表语句,或者表视图;
3、请提供你想导入的csv文件的模拟文件,不用100万行,模拟几千行即可!
最后,这个代码从整体来看是完整的,从功能来看是基本具备的,用的是本地的代码,操作的是本地的文件,链接的是本地的数据库,然后你在网上找人给你调试,这不有点扯嘛?当然也不是完全 帮不上你,起码您 得把相关的模拟文件给我们准备一下吧?

TA的精华主题

TA的得分主题

发表于 2023-1-5 10:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
大量数据保存,可参考插件:
十万,百万数据保存到SQL Sever数据库,耗时几秒--几十秒
见439楼: https://club.excelhome.net/thread-859194-1-1.html

DLL内函数本身
1.png

vba中的调用
2.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-5 17:46 | 显示全部楼层
用的是本地的代码,操作的是本地的CSV文件,链接的是本地的数据库. 只是CSV数据太大,有的100万条一个文件,而且多个,CSV表格式都是一样的,想把数据都汇总到SQL一个表里。感觉用数组会很慢,想直接用数据库方式插入速度会好一些.
附件是写的程序,还有数据源CSV文件范本2个,SQL表文件。看高手们帮我修改我的代码错在哪里。十分感谢

多个CSV文件批量导入SQL数据库.zip

241.14 KB, 下载次数: 2

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-5 17:47 | 显示全部楼层
WANT-T 发表于 2023-1-5 09:44
1、报错位置,报错内容,报错原因是什么?
2、我们联不上你的本地SQLserver数据库,请提供建表语句,或者 ...

您好,6楼上传了程序文件,csv模拟文件,建SQL表语句。您有空帮我看看。十分感谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-5 17:50 | 显示全部楼层
opiona 发表于 2023-1-5 10:40
大量数据保存,可参考插件:
十万,百万数据保存到SQL Sever数据库,耗时几秒--几十秒
见439楼: https://cl ...

谢谢,我只是初始化数据汇总用一次即可,不是经常用。现在写的代码只是差了一步。就不用单独编写的组件来导入了。
加上也想熟悉一下VBA的代码,所以还是用常规的VBA代码,看怎么实现在VBA代码范畴里快速批量导入CSV文件到SQL数据库。

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-1-5 18:02 | 显示全部楼层
  1. Const dizhi As String = "D:\test"    '这个路径名最后一定要有一个反斜杠 "\,如果文档目录有改变,这里需要改变"
  2. 'Const geshiC As String = ".xls"   '(如果是2007版,则后缀名改为 *.xlsx)

  3. Const geshiC As String = ".csv"

  4. '用的是本地的代码,操作的是本地的CSV文件,链接的是本地的数据库. 只是CSV数据太大,有的100万条一个文件,而且多个,CSV表格式都是一样的,想把数据都汇总到SQL一个表里。感觉用数组会很慢,想直接用数据库方式插入速度会好一些
  5. Sub 批量导入文件到sql()
  6.     '这个写法如果是xls/xlsx格式的没有问题,两个xls表可以导入,但是改成csv格式文件的,则提示:Error -2147467259(外部表不是预期的格式。),我其实要批量导入的是csv格式的文件。
  7.    
  8. #If ProjectStatus = "DEV" Then
  9.     Dim cn As ADODB.Connection

  10. #Else ' assume PROD
  11.     Dim cn As Object
  12.     Set cn = CreateObject("ADODB.Connection")
  13. #End If
  14.     Dim strSQL As String
  15.     Dim strConn As String
  16.     Dim path As String, fnTemp As String
  17.     Dim FileCount As Integer
  18.     Dim start As Double
  19.     start = Timer()   '计算这个程序运行时间。
  20.    
  21.     On Error GoTo test_Error
  22.    
  23.    
  24.     Dim fn, fp
  25.     '关闭屏幕刷新
  26.     Application.ScreenUpdating = False
  27.       
  28.    
  29.     fp = dizhi
  30.     'fp = ThisWorkbook.path
  31.    
  32.     fn = Dir(fp & "*" & geshiC) '取得第一个工作簿的文件名


  33.     FileCount = 0
  34.     Do While fn <> ""
  35.         Headers = True

  36.    
  37.         path = fp & fn
  38.         fnTemp = Replace(fn, geshiC, "")
  39.         strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";" & "Extended Properties=""Excel 12.0; IMEX=1;HDR=YES"""    '这条语句支持xls/xlsx格式文件,不支持CSV格式
  40.         Debug.Print strConn
  41.       
  42.         cn.Open strConn
  43.          
  44.         
  45.         strSQL = "Insert INTO [odbc;Driver={SQL Server};" & _
  46.                  "Server=.;Database=test;" & _
  47.                  "UID=sa;PWD=sa].test Select 字段一,字段二,字段三,字段四,字段五,字段六 FROM [" & fnTemp & "$] "
  48.         
  49.         'Debug.Print strSQL
  50.         cn.Execute strSQL

  51.         FileCount = FileCount + 1
  52.         fn = Dir() '取得下一个工作簿的文件名
  53.         cn.Close
  54.    
  55.     Loop '循环
  56.     Set cn = Nothing

  57.    '打开屏幕刷新
  58.     Application.ScreenUpdating = True
  59.     fenzhong = Int(Format(Timer - start, "0.00") / 60)
  60.     MsgBox "程序运行时间约是 " & fenzhong & " 分钟.导入" & FileCount & "CSV文件"
  61.     On Error GoTo 0
  62.     Exit Sub
  63.      
  64. test_Error:
  65.      
  66.     MsgBox "strSQL=" & strSQL & Chr(10) & " Error " & Err.Number & " (" & Err.Description & ")  " & Chr(13) & " fnTemp=" & fnTemp & Chr(13) & "path=" & path & Chr(13) & "strConn=" & strConn
  67.      
  68. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2023-1-5 23:06 | 显示全部楼层
chengsijing 发表于 2023-1-5 17:50
谢谢,我只是初始化数据汇总用一次即可,不是经常用。现在写的代码只是差了一步。就不用单独编写的组件来 ...

只用一次  就不用这么麻烦了   
直接数据库管理软件 Navicat等: 导入CSV
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-19 20:17 , Processed in 0.050190 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表