从 Microsoft Access VBA 调用时获取 SQL Server 存储过程的返回值

问题描述 投票:0回答:1

我有下面的 VBA 子程序。它将成功运行存储过程,但我想通过查看返回值来知道存储过程是否运行成功。到目前为止我无法单独使用VBA获得返回值。存储过程正在删除并创建一个表。

Public Sub New_Report_2()
    
        Dim strConnection As String, db As DAO.Database, rs As Recordset, qd As QueryDef
        
        Set db = CurrentDb
        
        strConnection = "ODBC;DRIVER=SS;SERVER=x;DATABASE=y;Trusted_Connection=Yes"
        
       ' Create a temporary QueryDef object to retrieve data from a Microsoft SQL Server database.
        Set qd = db.CreateQueryDef("")
        With qd
            .Connect = strConnection
            .ODBCTimeout = 200
            .sql = "exec myschema.month_end_01"
            .ReturnsRecords = True
            Set rs = .OpenRecordset()
            If (rs.BOF And rs.EOF) Then
                Debug.Print "1 - Stored Procedure Return Value: " & rs![Return Value]
            Else
                Debug.Print "2 - Stored Procedure Return Value: " & rs![Return Value]
            End If
       End With
    
    End Sub

我收到此错误:

enter image description here

我尝试了另一种方式:

Public Sub New_Report_2()

    Dim strConnection As String, db As DAO.Database, rs As Recordset, qd As QueryDef
    
    Set db = CurrentDb
    
'   strConnection = fnstrConnection
    strConnection = "ODBC;DRIVER=SQL Server;SERVER=x;DATABASE=y;Trusted_Connection=Yes"
    
   ' Create a temporary QueryDef object to retrieve data from a Microsoft SQL Server database.
    Set qd = db.CreateQueryDef("")
    With qd
        .Connect = strConnection
        .ODBCTimeout = 200

        .sql = "declare @return_value int" & vbCrLf
        .sql = .sql + "exec @return_value = myschema.my_sp" & vbCrLf
        .sql = .sql + "select 'Return Value' = @return_value"
        
        .ReturnsRecords = True
        
        Debug.Print .sql
        
        Set rs = .OpenRecordset()
        If (rs.BOF And rs.EOF) Then
            Debug.Print "1 - Stored Procedure Return Value: " & rs![Return Value]
        Else
            Debug.Print "2 - Stored Procedure Return Value: " & rs![Return Value]
        End If
   End With

End Sub

然后我收到此错误:

enter image description here

如果我像这样在直通查询中调用存储过程,那么我可以获得返回值,但如果不需要,我不想创建直通查询。

enter image description here

Public Sub New_Report_3()

    Dim db As DAO.Database, rs As Recordset
    
    Set db = CurrentDb
    
    Set rs = db.OpenRecordset("Test Pass Thru")
    
    If (rs.BOF And rs.EOF) Then
        Debug.Print "1 - Stored Procedure Return Value: " & rs![Return Value]
    Else
        Debug.Print "2 - Stored Procedure Return Value: " & rs![Return Value]
    End If

End Sub 

谢谢大家的宝贵时间,我很感激。

猜猜我想到了什么。 我的第二个例子在这一行中有一个缺少“=”的拼写错误:

之前:

.sql = .sql + "exec @return_value myschema.my_sp" & vbCrLf

之后:

.sql = .sql + "exec @return_value = myschema.my_sp" & vbCrLf

现在返回值已返回。

但是,如果有更优雅的方法来做到这一点,我很想知道。再次谢谢大家。

sql-server vba ms-access stored-procedures return-value
1个回答
0
投票

我认为,最好的方法是在 SQL Server 中创建存储过程。也可以是这样的。

CREATE PROCEDURE [dbo].[test]
AS
BEGIN
DECLARE @return_value int
set @return_value=10
select 'Return Value' = @return_value 
END
GO

我使用 Microsoft ActiveX 数据对象 (ADO) 作为数据访问技术。

Private Sub TestRun()
Dim cn As New adodb.Connection
cn.ConnectionString = "Provider='SQLOLEDB';Data Source='x';Initial Catalog='y';Integrated Security='SSPI';"
cn.Open
Dim rs As New adodb.Recordset
Dim cmd_SQLCommand As adodb.Command

Set cmd_SQLCommand = New adodb.Command
cmd_SQLCommand.CommandText = "test"
cmd_SQLCommand.CommandType = adCmdText
cmd_SQLCommand.ActiveConnection = cn
Set rs = cmd_SQLCommand.Execute()
MsgBox rs.Fields(0).Value
End Sub
© www.soinside.com 2019 - 2024. All rights reserved.