Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
从Access前端执行SQL数据库备份_Sql_Sql Server_Ms Access_Vba - Fatal编程技术网

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

从Access前端执行SQL数据库备份,sql,sql-server,ms-access,vba,Sql,Sql Server,Ms Access,Vba,我创建了一个脚本来备份SQL中的特定数据库。我已经对它进行了测试,在SQL中执行时效果很好 我希望能够使用Access前端执行此脚本,以便最终用户能够在需要时运行备份 查询似乎超时了,我在执行查询时尝试了多种不同的方法 这是我执行备份的脚本 CREATE PROCEDURE [dbo].[ASP_XXBackUp] (@name VARCHAR(50), -- database name @RETURNVALUE CHAR(1) = NULL OUTPUT) AS BEGIN DECL

我创建了一个脚本来备份SQL中的特定数据库。我已经对它进行了测试,在SQL中执行时效果很好

我希望能够使用Access前端执行此脚本,以便最终用户能够在需要时运行备份

查询似乎超时了,我在执行查询时尝试了多种不同的方法

这是我执行备份的脚本

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前端执行此操作


我在Access中尝试执行的方法:

方法1 将blnReturnValue设置为布尔值 Dim 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")
这是我收到的错误消息:
最简单的代码和方法是在Access中创建传递查询。这样您就不会在代码中弄乱连接Sting等

执行此操作的VBA代码为:

With CurrentDb.QueryDefs("qryPassR")
  .SQL = "MyCoolStoredProc"
  .Execute
End With
请注意,上面的代码执行该存储过程是多么简单

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

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

请记住,您应该在传递的属性表中设置“返回记录”。但是,由于我们有这个“catch all”查询,所以只需根据需要设置返回记录(对于不返回记录的存储过程和T-SQL命令,则为SQL SELECT或任何其他返回数据的命令设置值=false和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”是可选的(就像在SQLServerManagementStudio中输入它一样)。因此,我们可以使用:

  .SQL = "ASP_XXBackUp '" & gDatabase & "'"

所以,一旦创建了一个传递查询,就可以在需要执行T-SQL或任何SQL作为传递服务器端的地方使用它。注意,在上面我们使用了
OpenRecordSet
,因此我们必须设置
ReturnsRecords=True
。如果不返回记录,则希望使用
.Execute
代替
.OpenRecordSet

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

执行此操作的VBA代码为:

With CurrentDb.QueryDefs("qryPassR")
  .SQL = "MyCoolStoredProc"
  .Execute
End With
请注意,上面的代码执行该存储过程是多么简单

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

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

请记住,您应该在传递的属性表中设置“返回记录”。但是,由于我们有这个“catch all”查询,所以只需根据需要设置返回记录(对于不返回记录的存储过程和T-SQL命令,则为SQL SELECT或任何其他返回数据的命令设置值=false和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”是可选的(就像在SQLServerManagementStudio中输入它一样)。因此,我们可以使用:

  .SQL = "ASP_XXBackUp '" & gDatabase & "'"

所以,一旦创建了一个传递查询,就可以在需要执行T-SQL或任何SQL作为传递服务器端的地方使用它。注意,在上面我们使用了
OpenRecordSet
,因此我们必须设置
ReturnsRecords=True
。如果您不返回记录,那么您希望使用
.Execute
代替
.OpenRecordSet

您的意思是“超时”吗?您得到的确切错误是什么?在SSMS中运行时需要多长时间?您使用什么代码从MS Access运行它?当我在SQL中运行它时,更新了上面的@Nick.McDermaid。完成备份大约需要3-5分钟。错误是否总是在30秒后出现?默认查询超时为30秒-您需要将其延长到10分钟。我相信这是您需要更改的属性:@Nick.McDermaid这是我正在寻找的解决方案!谢谢你是说真的“超时”吗?您得到的确切错误是什么?在SSMS中运行时需要多长时间?您使用什么代码从MS Access运行它?当我在SQL中运行它时,更新了上面的@Nick.McDermaid。完成备份大约需要3-5分钟。错误是否总是在30秒后出现?默认查询超时为30秒-您需要将其延长到10分钟。我相信这是您需要更改的属性:@Nick.McDermaid这是我正在寻找的解决方案!谢谢