Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server VBA备份数据库的存储过程中没有结果集_Sql Server_Vba - Fatal编程技术网

Sql server VBA备份数据库的存储过程中没有结果集

Sql server VBA备份数据库的存储过程中没有结果集,sql-server,vba,Sql Server,Vba,我需要执行一个存储过程,对特定的数据库进行一些更改,同时对其进行备份。出于某种原因,当备份代码处于活动状态时,在VBA的记录集中我没有得到任何行,但备份是有效创建的 记录集关闭,错误。描述为“对象关闭时不允许操作”。如果我在存储过程中注释备份代码,记录集将打开,我将得到结果为1的行 在vb代码中,我使用adAsyncExecute调用存储过程,并使用以下代码等待: 知道为什么记录集关闭,并且在成功执行sp时不返回1行吗 编辑: 如果我使用exec在SSMS中执行sp,它会工作,并且我可以看到包含

我需要执行一个存储过程,对特定的数据库进行一些更改,同时对其进行备份。出于某种原因,当备份代码处于活动状态时,在VBA的记录集中我没有得到任何行,但备份是有效创建的

记录集关闭,错误。描述为“对象关闭时不允许操作”。如果我在存储过程中注释备份代码,记录集将打开,我将得到结果为1的行

在vb代码中,我使用adAsyncExecute调用存储过程,并使用以下代码等待:

知道为什么记录集关闭,并且在成功执行sp时不返回1行吗

编辑: 如果我使用exec在SSMS中执行sp,它会工作,并且我可以看到包含值的行。

12.01.2015

  • 我为另一个用户发现了完全相同的问题,但没有解决方案

  • 我试图在同步模式下执行sp,但遇到了同样的问题

  • 这不是超时问题。当前命令的超时时间为180秒,sp大约需要40秒才能完成

VB代码:

             sDB = "master"
             TrustedConnection = True
             ReDim arrPara(1, 2)
             arrPara(0, 1) = sStandardDatabaseSTR: arrPara(1, 1) = "@DATABASE"
             arrPara(0, 2) = 1: arrPara(1, 2) = "@STEP"
             Set rs = ADO_OpenParameterQuerySTR("dbo.Frozen_Generation", adCmdStoredProc, arrPara, , True)
             Do While rs.ActiveCommand.State = adStateExecuting 'or 4
                'sleep 1000
                DoEvents
             Loop
             rs.MoveFirst <-- Here I got the closed recordset when using the backup block
Function ADO_OpenParameterQuerySTR(ByVal sSQL As String, CommandType As CommandTypeEnum, Optional arrParameter As Variant, Optional iQueryTimeout As Variant, Optional async As Boolean = False) As ADODB.Recordset
   On Error GoTo errHandler
   LogToFile currentModule, "ADO_OpenParameterQuerySTR", "exec " & sSQL & " " & SerializeArray(arrParameter)
   Dim cmd As New ADODB.Command
   Dim para As ADODB.Parameter
   Dim blFound As Boolean
   Dim i As Variant, j As Variant, iType As Variant

Start:
    cmd.ActiveConnection = DBconnSTR

    cmd.CommandType = CommandType
    cmd.CommandText = sSQL
    cmd.CommandTimeout = 180

    If Not IsMissing(iQueryTimeout) Then
      cmd.CommandTimeout = iQueryTimeout
    End If

    If blDebugSTR Then Debug.Print sSQL

    If CommandType = 4 Then
        If Not IsMissing(arrParameter) Then
            blFound = False
            For i = 0 To cmd.Parameters.Count - 1
                If cmd.Parameters(i).Name <> "@RETURN_VALUE" Then
                    For j = 0 To UBound(arrParameter, 2)
                        If cmd.Parameters(i).Name = arrParameter(1, j) Then
                            cmd.Parameters(i) = IIf(arrParameter(0, j) = "", Null, arrParameter(0, j))

                            #If DEBUG_MODUS = 1 Then
                              Debug.Print cmd.Parameters(i).Name & " - " & cmd.Parameters(i).value
                           #End If
                            blFound = True
                        End If
                    Next
                End If

            Next
            If cmd.Parameters.Count = 0 And UBound(arrParameter, 2) >= 0 Then
                For i = 0 To UBound(arrParameter, 2)
                    If Not IsNumeric(arrParameter(0, i)) Then
                     'adVarBinary
                        If TypeName(arrParameter(0, i)) = "Byte()" Then
                           iType = adLongVarBinary
                        Else
                           iType = adVarChar
                        End If
                    Else
                        iType = adInteger
                    End If

                    Set para = cmd.CreateParameter(arrParameter(1, i), iType, adParamInput, 250)
                    cmd.Parameters.Append para
                    cmd.Parameters(arrParameter(1, i)) = arrParameter(0, i)
                Next
            End If
        End If
    End If
    If InStr(1, sSQL, "?", vbTextCompare) > 0 Then
        For i = 0 To UBound(arrParameter, 2)
            cmd.Parameters(i) = arrParameter(0, i)
        Next
    End If


    Set ADO_OpenParameterQuerySTR = New ADODB.Recordset
    If (async) Then
        ADO_OpenParameterQuerySTR.Open cmd, , adOpenStatic, adLockOptimistic, adAsyncExecute
    Else
        ADO_OpenParameterQuerySTR.Open cmd, , adOpenStatic, adLockOptimistic
    End If

exit_me:
   On Error GoTo 0
   Exit Function

errHandler:
   LogToFile currentModule, "ADO_OpenParameterQuerySTR", Err.Number & ", " & Err.Description
   Debug.Print Err.Number & ", " & Err.Description
   If Err.Number = -2147467259 Then
      Set m_ADO_STR = Nothing
      Application.Wait (Now + TimeValue("0:00:01"))
      Resume Start
   End If
   If Err.Number = 3709 Then Resume Start
   If Err.Number = -2147217911 Then
      'No Rights to Execute
      MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure ADO_OpenParameterQuerySTR of Modul mdlDatabase"
   End If
   If Err.Number = -2147217871 Then
      MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure ADO_OpenParameterQuerySTR of Modul mdlDatabase"
   End If


   Resume exit_me
   Resume

End Function
ALTER PROCEDURE [dbo].[Frozen_Generation]
(
    @DATABASE as varchar(100),
    @STEP as int
)
AS
--general
DECLARE @ParmDefinition NVARCHAR(500);
DECLARE @SQLQuery AS NVARCHAR(500)
DECLARE @now DateTime

DECLARE @resStep1_1 int
DECLARE @resStep1_2 int
DECLARE @resStep1_1_ERR varchar(200)
DECLARE @resStep1_2_ERR varchar(200)

--backup
DECLARE @fileName VARCHAR(90);
DECLARE @db_name VARCHAR(20);
DECLARE @fileDate VARCHAR(20);

BEGIN
    SET NOCOUNT ON;

    SET @now = GETDATE()

    if (@STEP=1) begin

        SET @ParmDefinition = N'@SettingsValueBIT int, @SettingsName varchar(100), @UpdatedOn smalldatetime';
        SET @SQLQuery = 
        N'use ' + @DATABASE + ';
        UPDATE dbo.A_ConfigSettings set SettingsValueBIT=@SettingsValueBIT, UpdatedOn=@UpdatedOn  where SettingsName=@SettingsName'
        EXECUTE @resStep1_1 = sp_executesql @SQLQuery, @ParmDefinition, @SettingsValueBIT=0, @SettingsName='APP_Status',@UpdatedOn=@now;


        -- Make backup (If I comment this block, I got 1 row in the recordset)
        BEGIN TRY
            SET @fileName = 'E:\backups\'; -- change to the relevant path 
            SET @db_name = 'frozenwizard';     -- change to the relevant database name 
            SET @fileDate = CONVERT(VARCHAR(20), GETDATE(),112);
            SET @fileName = @fileName + @db_name + '_' + RTRIM(@fileDate) + '.bak';
            SET @SQLQuery = N'BACKUP DATABASE '+@DATABASE+' TO DISK = ''' + @fileName + ''''
            EXECUTE @resStep1_2 = sp_executesql @SQLQuery
        END TRY
        BEGIN CATCH
            SELECT @resStep1_2=ERROR_NUMBER(), @resStep1_2_ERR=ERROR_MESSAGE();
        END CATCH

        SELECT
         @resStep1_1 as resStep1_1, coalesce(@resStep1_1_ERR,'') as resStep1_1_ERR
         @resStep1_2 as resStep1_2, coalesce(@resStep1_2_ERR,'') as resStep1_2_ERR

    end

END

如何调用此SP?我已经添加了codec,您可以在SSMS中执行过程时发布所有输出吗?这只是一个建议,但请尝试在呼叫返回后调用rs.NextRecordset。可能您要查找的行不是第一个resultset。@Spock感谢您的建议,但存储过程只返回1个resultset。不管怎样,我试过rs.NextRecordset,但没有成功。