我对此有点新意,所以我提前为任何错误道歉。我试图打开并执行一个保存在C盘中的SQL查询。 sql工作正常。我没有写那个sql,它是一个非常大的文件,所以不想在VBA中添加代码。我一直在这个网站和其他地方搜索,但努力使这项工作。我每次都有一些或其他问题。我正在粘贴下面的代码,让你看看并帮助我。我已经在我的VBA代码中创建了这个函数。
Public Function ss()
'Open Connection
Dim oCon As ADODB.Connection
Set oCon = New ADODB.Connection
'Set Connection String
Dim sCon As String
sCon = "Provider=SQLOLEDB;Persist Security Info=True;User
ID='*****';Password='*****';Initial Catalog=****;Data Source=*******;Use
Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Use Encryption
for Data=False;Tag with column collation when possible=False"
oCon.Open sCon 'Connect established
'Create recordset
Dim ps As ADODB.Recordset
Set ps = New ADODB.Recordset
'Set & execute SQL Command
Dim pCMD As ADODB.Command
Set pCMD = New ADODB.Command
Set pCMD.ActiveConnection = oCon
Dim filename As String
filename = "C:\Users\???????????\******.sql"
'select data
pCMD.CommandText =
CreateObject("scripting.filesystemobject").opentextfile(filename).ReadAll()
Set ps = pCMD.Execute(, , adCmdText)
Debug.Print ps.GetRows
If ps.EOF = False Then Sheets("Sheet2").Range("A1").CopyFromRecordset ps
'Close connection
Set ps = Nothing
Set pCMD = Nothing
oCon.Close
Set oCon = Nothing
End Function
Debug.Print仅用于查看结果,但它显示相同的错误"运行时错误' 3704'关闭对象时不允许操作。在尝试了这么多不同的事情后,我不确定我做错了什么。
有人可以帮忙吗?
任何帮助都将非常感激。
答案 0 :(得分:0)
对我来说,最简单的解决方案是修改存储过程的结束,以便在执行时将所有结果插入表中。下次执行SP时,您只需TRUCATE
表格和INSERT
新结果。
执行SP
您可以使用您在StackOverflow上找到的一些代码,使用VBA从Excel调用SP,例如以下内容(我从this回答):
Dim cnn As Object
Set cnn = CreateObject("ADODB.Connection")
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
cmd.CommandType = 1 ' adCmdText
cmd.CommandTimeout = 120 ' number of seconds to time out
Dim ConnectionString As String
cnn.ConnectionString = "driver={SQL Server};server=MYSERVERNAME;Database=MYDATABASE;Trusted_Connection=yes;"
cnn.Open
Dim SQL As String
SQL = "EXEC [dbo].[Procedure_make_report] 'param1'"
cnn.Open
cmd.CommandText = SQL
cmd.ActiveConnection = cnn
cmd.Execute
If Not cnn Is Nothing Then
cnn.Close
Set cnn = Nothing
End If
将结果导入Excel