2016-12-16 103 views
0

私の目標は、vba関数からSQL Serverストアドプロシージャを実行し、ストアドプロシージャがレコードを返すかどうかをチェックすることです。VBA:ストアドプロシージャの戻り値を取得する方法

Function TestStoredProcedure() 

    Dim strMsg As String 

    Dim ADOCon As ADODB.Connection 
    Dim ADOQD As ADODB.Command 
    Dim ADORS As ADODB.Recordset 

    Set ADOCon = New ADODB.Connection 
    ADOCon.ConnectionString = GetConnectionString("Dev") 
    ADOCon.CommandTimeout = 0 
    ADOCon.Open 

    Set ADOQD = New ADODB.Command 
    ADOQD.ActiveConnection = ADOCon 
    ADOQD.CommandTimeout = 0 

    ADOQD.CommandType = adCmdStoredProc 
    ADOQD.CommandText = "mn_CheckForInvalidEntries" 

    'Execute 
    Set ADORS = ADOQD.Execute 

    If ADORS.RecordCount > 0 Then 

    strMsg = "The SLI Search Feed was not successful." 
      MsgBox strMsg, vbExclamation, "foo" 
    Else 
     strMsg = "The SLI Search Feed successful." 
      MsgBox strMsg, vbExclamation, "foo" 
    End If 

    ADOCon.Close 
    Set ADOQD = Nothing 
    Set ADOCon = Nothing 
    strMsg = "" 

End Function 

ストアドプロシージャ:私はこれまでのところ得VBAコードで

ALTER PROCEDURE [dbo].[mn_CheckForInvalidEntries] 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT 
     [ProductID] 
    , [ForSale] 
    FROM [Product] 
    WHERE [ProductID] IN 
     (
     SELECT 
      [SearchIndex].[ProductID] 
     FROM [dbo].[SearchIndex] 
     INNER JOIN [ProductData] 
      ON [dbo].[SearchIndex].[ProductID] = [ProductData].[ProductID] 
     WHERE [ForSale] = 1 
        AND [SearchIndex].[ProductID] NOT LIKE 'mn[d-g]%' 
        AND [Record] IS NULL 
        AND [SearchIndex].[ProductID] NOT LIKE 'mn[a-z]%' 
END; 

spはいずれかを返された場合、私はチェックの一部を得ることに任意の助けを得ることができれば値は、それは素晴らしいでしょう。

ありがとうございます。

+1

このプロシージャは行を返すように見えるので、ADOレコードセットを 'Execute'の戻り値に割り当てようとしましたか? 'Set rs = ADOQD.Execute()'それから 'rs.EOF'をチェックし、それに応じて進んでください。 –

+0

私は持っており、私が返すものは-1です。私はいくつかのコメント、推奨を待っている間に私が試したことを見ることができるように私のVBコードを更新しています。 –

+3

レコードがあるかどうかを判断するために 'Recordcount'(実際には特定のカーソルタイプのみで動作します)を使わないでください:何も返されなければ' ADORS.EOF'は真となります –

答えて

3

結果を格納するには、レコードセットを使用します。

Dim adoRs As ADODB.Recordset 
Set adoRs = ADOQD.Execute 

次に、レコードセットが空であるかどうかを確認できます。

isEmpty = (adoRs.BOF And adoRs.EOF) 
0

Excelからストアドプロシージャを実行するだけですか?あなたが試してみるための2つのオプションがあります。

Option Explicit 

Sub Working2() 

Dim con As Connection 
Dim rst As Recordset 
Dim strConn As String 

Set con = New Connection 
strConn = "Provider=SQLOLEDB;" 
strConn = strConn & "Data Source=LAPTOP\SQL_EXPRESS;" 
strConn = strConn & "Initial Catalog=Northwind;" 
strConn = strConn & "Integrated Security=SSPI;" 

con.Open strConn 

'Put a country name in Cell E1 
Set rst = con.Execute("Exec dbo.TestNewProc '" & ActiveSheet.Range("E1").Text & "'") 

'The total count of records is returned to Cell A5 
ActiveSheet.Range("A5").CopyFromRecordset rst 

rst.Close 
con.Close 

End Sub 


Sub Working() 


Dim con As Connection 
Dim rst As Recordset 

Set con = New Connection 
con.Open "Provider=SQLOLEDB;Data Source=LAPTOP\SQL_EXPRESS;Initial Catalog=Northwind;Integrated Security=SSPI;" 

Set rst = con.Execute("Exec dbo.[Ten Most Expensive Products]") 
'Results of SProc are returned to Cell A1 
ActiveSheet.Range("A1").CopyFromRecordset rst 

rst.Close 
con.Close 
End Sub 
関連する問題