Excel中的VBA查询记录集值SQL类型不匹配错误
问题描述:
使用SQL Server 2012 \ Excel 2010. Excel调用将返回1或2的SQL SP,然后我需要基于此执行其他操作。Excel中的VBA查询记录集值SQL类型不匹配错误
Dim con As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.RecordSet
Dim WSP1 As Worksheet
Set con = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.RecordSet
' Log into our SQL Server, and run the Stored Procedure
con.Open "Provider=SQLOLEDB;Data Source=xxxxxxxx;Initial Catalog=xxxxxxx;Integrated Security=SSPI;Trusted_Connection=Yes;"
cmd.ActiveConnection = con
' Set up the parameter for our Stored Procedure
' (Parameter types can be adVarChar,adDate,adInteger)
cmd.Parameters.Append cmd.CreateParameter("User", adVarChar, adParamInput, 15, Trim(Range("C7").Text))
Application.StatusBar = "Running stored procedure..."
cmd.CommandText = "usp_GL_Code_Access"
Set rs = cmd.Execute(, , adCmdStoredProc)
If rs = 1 Then
MsgBox "true"
Else
MsgBox "false"
rs.Close
Set rs = Nothing
Set cmd = Nothing
con.Close
Set con = Nothing
目前我只是使用MSGBOX真\假看到从RS \ SQL SP的价值,但我不断收到错误消息“类型不匹配”,它凸显了
IF rs = 1 Then
线。
任何想法?
答
rs
是一个记录集对象,将它与1
进行比较是无效的,它不是从过程返回的值。
如果1或2是由SELECT
的值,然后读取单个值:
if rs.eof then
msgbox "no rows"
else
result = rs.collect(0)
msgbox result
end if
答
我觉得做这样的效果会更好。
该函数使用ADO将SQL Server数据插入到目标Excel范围。
Function ImportSQLtoRange(ByVal conString As String, ByVal query As String, _
ByVal target As Range) As Integer
On Error Resume Next
' Object type and CreateObject function are used instead of ADODB.Connection,
' ADODB.Command for late binding without reference to
' Microsoft ActiveX Data Objects 2.x Library
' ADO API Reference
' http://msdn.microsoft.com/en-us/library/ms678086(v=VS.85).aspx
' Dim con As ADODB.Connection
Dim con As Object
Set con = CreateObject("ADODB.Connection")
con.ConnectionString = conString
' Dim cmd As ADODB.Command
Dim cmd As Object
Set cmd = CreateObject("ADODB.Command")
cmd.CommandText = query
cmd.CommandType = 1 ' adCmdText
' The Open method doesn't actually establish a connection to the server
' until a Recordset is opened on the Connection object
con.Open
cmd.ActiveConnection = con
' Dim rst As ADODB.Recordset
Dim rst As Object
Set rst = cmd.Execute
If rst Is Nothing Then
con.Close
Set con = Nothing
ImportSQLtoRange = 1
Exit Function
End If
Dim ws As Worksheet
Dim col As Integer
Set ws = target.Worksheet
' Column Names
For col = 0 To rst.Fields.Count - 1
ws.Cells(target.row, target.Column + col).Value = rst.Fields(col).Name
Next
ws.Range(ws.Cells(target.row, target.Column), _
ws.Cells(target.row, target.Column + rst.Fields.Count)).Font.Bold = True
' Data from Recordset
ws.Cells(target.row + 1, target.Column).CopyFromRecordset rst
rst.Close
con.Close
Set rst = Nothing
Set cmd = Nothing
Set con = Nothing
ImportSQLtoRange = 0
End Function
代码注释:
The query parameter can contain a SELECT or EXECUTE query.
The resulting data will be inserted starting from the top left cell of the target range.
Using Object types and the CreateObject function instead of direct use of ADO types
lets to avoid setting ActiveX Data Objects 2.x Library references on user computers.
This code works in Microsoft Excel 2003-2016.
Always use Set Nothing statements for ADODB.Connection and ADODB.Recordset objects to free resources.
将Excel中真正看到1或2,但?我需要继续SP,并说如果1然后做这个别的做别的 – Michael