Sql server VBA备份数据库的存储过程中没有结果集
我需要执行一个存储过程,对特定的数据库进行一些更改,同时对其进行备份。出于某种原因,当备份代码处于活动状态时,在VBA的记录集中我没有得到任何行,但备份是有效创建的 记录集关闭,错误。描述为“对象关闭时不允许操作”。如果我在存储过程中注释备份代码,记录集将打开,我将得到结果为1的行 在vb代码中,我使用adAsyncExecute调用存储过程,并使用以下代码等待: 知道为什么记录集关闭,并且在成功执行sp时不返回1行吗 编辑: 如果我使用exec在SSMS中执行sp,它会工作,并且我可以看到包含值的行。 12.01.2015Sql server VBA备份数据库的存储过程中没有结果集,sql-server,vba,Sql Server,Vba,我需要执行一个存储过程,对特定的数据库进行一些更改,同时对其进行备份。出于某种原因,当备份代码处于活动状态时,在VBA的记录集中我没有得到任何行,但备份是有效创建的 记录集关闭,错误。描述为“对象关闭时不允许操作”。如果我在存储过程中注释备份代码,记录集将打开,我将得到结果为1的行 在vb代码中,我使用adAsyncExecute调用存储过程,并使用以下代码等待: 知道为什么记录集关闭,并且在成功执行sp时不返回1行吗 编辑: 如果我使用exec在SSMS中执行sp,它会工作,并且我可以看到包含
- 我为另一个用户发现了完全相同的问题,但没有解决方案
- 我试图在同步模式下执行sp,但遇到了同样的问题
- 这不是超时问题。当前命令的超时时间为180秒,sp大约需要40秒才能完成
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,但没有成功。