2016-12-07 7 views
0

SQL Server 2012 \ Excel 2010を使用しています。Excelは1または2を返すSQL SPを呼び出し、それに基づいて別の処理を実行する必要があります。私はちょうどRS \ SQLのSPから値を参照する場合はfalse \真のMsgBoxを使用している時点ではExcelのVBAクエリレコードセットの値がSQL SPタイプの不一致エラー

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 

が、私は「型の不一致」エラーメッセージを受信し続けると、それは

IF rs = 1 Then 
を強調

行。

アイデア?

答えて

0

rsは、1と比較してレコードセットオブジェクトであり、有効ではありません。プロシージャから返された値ではありません。私はこのようにそれをやってする方が良いだろうと思う

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

Excelが実際にかかわらず、1または2が表示されますか?私はSPを続行し、それから他に何かする – Michael

0

1の場合または2には単一の値を読み込むため、その後SELECTからの値です。

この関数は、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. 
関連する問題