【发布时间】:2016-02-27 01:50:12
【问题描述】:
我有一个 Access 2010 数据库,其中所有表都链接到 SQL Server 2014 表。我有一个 Excel 2010 (.xlsx) 文件(虽然它以 .csv 开头,我可以保留它),我需要通过 VBA 代码将其导入 SQL Server 表。我知道可以使用导入工具来执行此操作,但是,我每月要导入 20 多个 XLS 文件,并且希望有一种自动化的方法来执行此操作。
我所有的 VBA 代码都驻留在 Access 数据库中,而我能够找到的所有 VBA 代码示例都是 推送 Excel 中的数据(即代码在 Excel 中)而不是 从 Access 中提取(即代码在 Access 中)。
我宁愿使用单个 INSERT INTO AccessTable SELECT FROM ExcelRange 查询而不是逐行读取 Excel,而且我需要在插入 Excel 数据之前对其进行一些转换。
到目前为止我所拥有的:
Private Sub TransferData(ByVal Company As String, ByVal Address As String, ByVal XLName As String)
Dim Con As ADODB.Connection
Dim SQLString As String
SQLString = "INSERT INTO SatSurvey " & _
"(ClinicID, Method, CollectionDate, Duration, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, Physician, Nurse, MedAst) " & _
"SELECT " & _
"('clinic name', IDFormat, IDendDate, IDtime, Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8, Q10, Q11, Q12, Q13, Q14, Q15, Q16, Q17, Q18, Q19, Q20, Q21, Q22, NZ(Q9s1,1), NZ(Q9s2,1), NZ(Q9s3,1)) " & _
" FROM [Excel 12.0;HDR=Yes;Database=" & XLName & "]." & Address
Set Con = New ADODB.Connection
' Con.ConnectionString = "Datasource=" & CurrentProject.Connection
Con.ConnectionString = CurrentProject.Connection
' Con.Properties(9).Value = "Extended Properties='Excel 12.0 Xml;HDR=YES';"
' Con.Provider = "Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0 Xml;HDR=YES';"
Con.Open
Con.Execute SQLString
End Sub
如您所见,我尝试了几种不同的方法来让事情正常进行。这似乎是我现在得到的最好的 except:
运行时错误“-2147467259 (80004005)”:
数据库已被计算机“MINIT-EGHJSAU”上的用户“管理员”置于阻止其打开或锁定的状态。
指示的机器名称是 my 机器。由于代码是在我机器上的 Access 中运行的,因此我应该打开数据库似乎是合乎逻辑的。
我不喜欢这样做,所以欢迎任何修复或替代建议。
【问题讨论】:
-
收到“状态”消息后,保存代码更改,运行压缩和修复,然后再次尝试运行代码。
-
你真的应该参数化这些插入。按照编码,这很容易受到 sql 注入的影响。
-
你看过 SSIS 吗?它是为处理这类事情而设计的。
-
@SeanLange - 我很欣赏 SQL 注入问题。但是,参数将来自数据库本身作为配置项。我们中只有 2 人可以设置参数,所以little Bobby Drop Tables 不太可能会过来。
-
如果您对这些参数感到满意,那么这对我来说肯定不是问题。 :)
标签: vba ms-access ms-access-2010 excel-2010