【发布时间】:2016-03-16 06:15:54
【问题描述】:
流程在Excel VBA 2010和MS SQL Server 2008环境下运行。
假设在 Excel 表格中有一个简单的一列数据,包含 1500 行,我们希望使用 VBA 代码中的 SQL 查询将其导出到数据库(VBA 中的 SQL 过程在默认模式下一次最多导出 1000 行)。
这个问题有一个限制:导出过程必须使用 dbclass-connection 而不是 ADODB 连接。 (代码所有者不是我。代码所有者正在使用 dbclass 编写相当大的 VBA 代码,所以他可能不会接受更改整个代码。
我为ADODB.Connection 找到了类似lngRecsAff 的选项,其用法如下:
Sub test()
Dim cn As ADODB.Connection
Dim strSQL As String
Dim lngRecsAff As Long
Set cn = New ADODB.Connection
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\test.xls; Extended Properties=Excel 8.0"
strSQL = "Insert INTO [odbc;Driver={SQL Server};Server=SQL09;Database=Tom;UID=userID;PWD=password].tbl_test1 Select * FROM [Sheet1$]"
cn.Execute strSQL, lngRecsAff
cn.Close
Set cn = Nothing
End Sub
我尝试在我的 dbclass 执行中实现 lngRecsAff,例如:
Sub test()
Dim connOk As Boolean
Dim rs As New ADODB.Recordset
Set dbclass = New clsDB
Dim Value1() As Variant
Dim lngRecsAff As Long
Dim strSQL as String
Dim mstrErr as Boolean
dbclass.Database = "database_name"
dbclass.ConnectionType = SqlServer
dbclass.DataSource = "server_name"
dbclass.UserID = Application.UserName
connOk = dbclass.OpenConnection(False, True)
If connOk = False Then
MsgBox "Unsuccessful connection!"
Else
MsgBox "Successful connection"
End If
strSQL = "INSERT INTO [dbo].[table1](Column1) Values('" & Value1 & "')"
mstrErr = dbclass.ExecuteSQL(strSQL, lngRecsAff) ' The result mstrErr is a Boolean
' Some closing options here
End Sub
我收到类似lngRecsAff 不适合我的ExecuteSQL 程序的错误。通常我的执行mstrErr = dbclass.ExecuteSQL(strSQL) 没有任何问题。
也许我可以使用for-loop 执行 SQL 过程,然后我可以将数据分成小块发送。但我想找到一个更有效、“更好”的解决方案,一次发送整个数组。
那么dbclass 有什么特殊选项可以将超过 1000 行从 Excel 发送到数据库吗?
【问题讨论】:
-
您的插入语句根本没有任何意义。您不会插入连接字符串。您使用连接字符串建立连接,然后向表中发出插入。
-
您不能使用比嵌入在 VBA 中的插入查询更合适的工具来导入数据吗?比如SSIS?
-
我对 SSIS 不熟悉,但现在我看了一下。我认为还有另一种选择,例如
OPENROWSET,我现在就去看看。你知道OPENROWSET选项是否可以导入长数据集吗? -
如果您必须使用自定义 DB 类(而不是直接使用 ADO)进行插入,那么您确实需要与该类的所有者讨论如何最好地将它用于您需要做的事情。由于我们不知道该类是如何实现的,所以在这里询问没有多大意义......
-
@tim-williams 我编辑了我的代码,它显示了代码如何打开与服务器的连接。我是否应该显示有关如何实现连接类的更多信息?
标签: sql-server vba excel import-from-excel