从 Access 前端执行 SQL 数据库备份

Posted

技术标签:

【中文标题】从 Access 前端执行 SQL 数据库备份【英文标题】:Execute SQL Database Backup from Access Front-End 【发布时间】:2017-01-06 13:19:19 【问题描述】:

我创建了一个脚本来备份 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中尝试执行的方法:

方法一 将 blnReturnValue 调暗为布尔值 将 cmd 调暗为 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")

这是我收到的错误消息:

【问题讨论】:

你的意思是真的“超时”吗?你得到的确切错误是什么?在 SSMS 中运行需要多长时间?您使用什么代码从 MS Access 运行它? 更新了上面的@Nick.McDermaid 当我在SQL中运行它大约需要3-5分钟来完成备份。 30秒后总是出现错误吗?默认查询超时时间为 30 秒 - 您需要将其延长至 10 分钟。我相信这是您需要更改的属性:msdn.microsoft.com/en-us/library/ms678265(v=vs.85).aspx @Nick.McDermaid 这是我正在寻找的解决方案!谢谢 【参考方案1】:

最简单的代码和方法是在 Access 中创建传递查询。这样你就不会在代码中弄乱连接字符串等。

执行此操作的 VBA 代码是:

With CurrentDb.QueryDefs("qryPassR")
  .SQL = "MyCoolStoredProc"
  .Execute
End With

请注意,上面的代码执行该存储过程非常简单。

当然,将使用您在属性表中为此传递查询设置的超时时间。所以你可以编辑属性表,或者简单地在代码中设置 ODBC 超时。

上面的“一个”查询 qryPassR 经常会在你的 VBA 代码中的无数地方使用。因此,您可以按照上述方式为任何内容设置 .SQL。

请记住,您应该在传递的属性表中设置“退货记录”。但是,由于我们有这个“包罗万象”的查询,那么只需根据需要设置返回记录(因此对于不返回记录的存储过程和 T-SQL 命令,然后将 value = false 设置为 SQL SELECT 和 true或任何其他返回数据的东西)。

因此,例如,您可能希望执行一些不从存储过程返回值(记录)的代码,因此您的代码将更像这样:

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

【讨论】:

以上是关于从 Access 前端执行 SQL 数据库备份的主要内容,如果未能解决你的问题,请参考以下文章

如何备份sqlserver数据

如何使用 Pass-through 查询从 MS Access 前端向 sql 表输入数据?

从 MS Access VBA 前端在 SQL 中使用 SESSION_CONTEXT

在 Access 中导入 .sql 文件

使用前端 ASP.net 从 Access db 迁移到 SQL Server 2008

在 Access 前端中为链接的 SQL 表/视图设置命令超时