2016-12-16 10 views
0

Моя цель - выполнить хранимую процедуру сервера sql из функции vba и проверить, вернула ли хранимая процедура какие-либо записи.VBA: как сохранить возвращаемое значение хранимой процедуры

В коде 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 

И хранимая процедура:

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; 

Если бы я мог получить любую помощь в получении части чека, если зр возвращается любой ценности, это было бы здорово.

спасибо.

+1

Эта процедура выглядит так, как будто она возвращает строки, так что вы пытались присвоить ADO Recordset возвращаемое значение 'Execute'? 'Set rs = ADOQD.Execute()' Затем проверьте для 'rs.EOF' и действуйте соответственно. –

+0

У меня есть, и я получаю взамен -1. Я обновляю свой код vb, чтобы вы могли видеть, что я пробовал, ожидая комментариев, рекомендаций. –

+3

Не используйте 'Recordcount' (который действительно работает только с определенными типами курсоров), чтобы определить, есть ли записи:' ADORS.EOF' будет True, если ничего не было возвращено –

ответ

3

Для сохранения результатов вы можете использовать набор записей.

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

Затем вы можете узнать, пуст ли набор записей.

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

Все, что вы хотите сделать, это запустить хранимую процедуру из Excel, не так ли? Вот два варианта для вас.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^