2016-12-07 45 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.