2016-12-07 38 views
0

使用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 

线。

任何想法?

回答

0

rs是一个记录集对象,将它与1进行比较是无效的,它不是从过程返回的值。

如果1或2是由SELECT的值,然后读取单个值:

if rs.eof then 
    msgbox "no rows" 
else 
    result = rs.collect(0) 
    msgbox result 
end if 
+0

将Excel中真正看到1或2,但?我需要继续SP,并说如果1然后做这个别的做别的 – Michael

0

我觉得做这样的效果会更好。

该函数使用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.