我创建了一个脚本来备份SQL中的特定数据库。我测试过它,在SQL中执行时效果很好。
我希望能够使用Access Front-End执行此脚本,以便最终用户在需要时运行备份。
查询似乎超时,我在执行查询时尝试了多种不同的方法。
这是我执行备份的脚本。
CREATE PROCEDURE [dbo].[ASP_XXBackUp]
(@name VARCHAR(50), -- database name
@RETURNVALUE CHAR(1) = NULL OUTPUT)
AS
BEGIN
DECLARE @path VARCHAR(256) -- path for backup files
DECLARE @fileName VARCHAR(256) -- filename for backup
DECLARE @fileDate VARCHAR(20) -- used for file name
-- specify database backup directory
SET @path = 'E:\SQL-Backup\ManualBackup\'
-- specify filename format
SELECT @fileDate = CONVERT(VARCHAR(20),GETDATE(),112) +
REPLACE(CONVERT(VARCHAR(8), GETDATE(), 108),':','')
-- specify filename
SET @fileName = @path + @name + '_' + @fileDate + '.BAK'
--Execute BackUp Sequence
BACKUP DATABASE @name TO DISK = @fileName
--Check that we managed to create a successful backup
SELECT TOP 1 @RETURNVALUE = dbo.fc_FileExists(@fileName);
-- Check if succeeded to find.
IF @@ROWCOUNT = 1
SELECT @RETURNVALUE
ELSE
SELECT @RETURNVALUE = 0 --we have failed
END
我有办法在Access Front-End中执行此操作吗?
我在Access中尝试过的方法执行:
方法1 Dim blnReturnValue As Boolean Dim cmd As ADODB.Command
blnReturnValue = False 'Assume failure
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = gcnn
.CommandText = "ASP_XXBackUp"
.CommandType = adCmdStoredProc
.Parameters.Append .CreateParameter("@name", adVarChar, adParamInput, 50, gDatabase)
.Parameters.Append .CreateParameter("@RETURNVALUE", adChar, adParamInputOutput, 1)
.Execute
blnReturnValue = .Parameters("@RETURNVALUE")
Set cmd = Nothing
End With
If blnReturnValue = False Then
Me.ChkBackUp = False
MsgBox "ERROR!: Backup Failed!" & vbCrLf & "Please contact your administrator!"
Else
Me.ChkBackUp = True
MsgBox "SUCCESS!: Databased Backed Up!"
End If
方法2
gcnn.Execute "EXEC ASP_XXBackUp '" & gDatabase & "'"
方法3
'Run proc to create journals for Year end
strSQL = "EXEC ASP_XXBackUp '" & gDatabase & "'"
Call ChangeQueryDef("qryPassThrough_SQL2", strSQL)
Call SQLPassThrough(strQDFName:="qryPassThrough_SQL2", strSQL:=strSQL, strConnect:=gODBCConn)
blnReturnValue = DCount("*", "qryPassThrough_SQL2")
答案 0 :(得分:2)
最简单的代码和方法是在Access中创建传递查询。这样你就不会在代码中弄乱连接叮咬等。
执行此操作的VBA代码为:
With CurrentDb.QueryDefs("qryPassR")
.SQL = "MyCoolStoredProc"
.Execute
End With
请注意上面的代码执行该存储过程非常简单。
当然,您将使用在此传递查询的属性表中设置的超时时间。因此,您可以编辑属性表,或者简单的代码设置ODBC超时。
上面的“one”查询qryPassR将在你的VBA代码中的多个地方使用OFTEN。所以你可以根据上面的内容设置.SQL。
请记住,您应该设置"返回记录"在传递的属性表中。但是,因为我们有这个" catch-all"查询,然后根据需要设置返回记录(因此对于不返回记录的存储过程和T-SQL命令,然后设置值= false,对于SQL SELECT或任何返回数据的其他内容设置为true)。 / p>
因此,您可能希望执行一些不从存储过程返回值(记录)的代码,因此您的代码将更像这样:
With CurrentDb.QueryDefs("qryPassR")
.SQL = "MyCoolStoredProc"
.ReturnsRecords = False
.Execute
End With
但是,在您的情况下,您希望返回记录,并希望将ODBC超时增加到5分钟,以便您可以使用:
Dim retValue As Integer
With CurrentDb.QueryDefs("qryPassR")
.SQL = "EXEC ASP_XXBackUp '" & gDatabase & "'"
.ReturnsRecords = True
.ODBCTimeout = 300 ' 300 seconds = 5 minutes
retValue = .OpenRecordset()(0)
End With
Debug.Print "ret value = " & retValue
请注意,在上面,“exec”是可选的(就像在SQL Server Management Studio中输入时一样)。所以我们可以使用:
.SQL = "ASP_XXBackUp '" & gDatabase & "'"
因此,一旦您创建了一个传递查询,那么您可以在每个需要执行T-SQL或任何SQL作为传递服务器端的地方使用它。请注意,我们使用OpenRecordSet
,因此我们必须设置ReturnsRecords = True
。如果您不返回记录,则需要使用.Execute
代替.OpenRecordSet
。