我已经写在过去的一个类似的应用。我的方法是创建一个SQL作业来执行备份。它不需要重复计划。
网页只需致电sp_start_job @job_name = 'MyBackupJob'
即可开始工作。这是异步的,所以不会有任何超时问题。 由于作业不能同时运行,因此也会使多个人同时运行备份。
然后使用Timer控件或基于javascript/web服务的方法,查询作业的状态。
作业不再运行时 - 提供要下载的链接。
以下是我用来开始/检查作业的方法。
''' <summary>
''' Starts the SQL Server job.
''' </summary>
''' <param name="jobName">Name of the job.</param>
''' <param name="connectionString">The connection string.</param>
''' <remarks>No exception handling is done. Assumes connection has access to msdb</remarks>
Public Sub StartJob(ByVal jobName As String, ByVal connectionString As String)
Using dbConn As New SqlConnection(connectionString)
Using dbCmd As New SqlCommand("msdb.dbo.sp_start_job", dbConn)
dbCmd.CommandType = CommandType.StoredProcedure
dbCmd.Parameters.AddWithValue("@job_name", jobName)
dbConn.Open()
dbCmd.ExecuteNonQuery()
dbConn.Close()
End Using
End Using
End Sub
''' <summary>
''' Determines whether [is job running] [the specified job name].
''' </summary>
''' <param name="jobName">Name of the job.</param>
''' <param name="connectionString">The connection string.</param>
''' <returns>
''' <c>true</c> if [is job running] [the specified job name]; otherwise, <c>false</c>.
''' </returns>
''' <remarks>No exception handling is done. Assumes connection has access to msdb</remarks>
Public Function IsJobRunning(ByVal jobName As String, ByVal connectionString As String) As Boolean
Using dbConn As New SqlConnection(connectionString)
Using dbCmd As New SqlCommand("msdb.dbo.sp_help_job", dbConn)
dbCmd.CommandType = CommandType.StoredProcedure
dbCmd.Parameters.AddWithValue("@job_name", jobName)
dbConn.Open()
Dim dr As SqlDataReader = dbCmd.ExecuteReader()
Dim stat As Integer
If dr.Read() Then
stat = Convert.ToInt16(dr("current_execution_status"))
Else
stat = -1
End If
dr.Close()
dbConn.Close()
If stat = 1 Then
Return True
Else
Return False
End If
End Using
End Using
End Function
你可能会进一步走一步,并检查工作通过检查msdb.dbo.sp_help_job @job_name ='MyBackupJob'
last_run_outcome的值可以通过运行该查询得到的备份文件名成功完成:
SELECT TOP 1 mf.physical_device_name FROM msdb.dbo.backupset AS s
INNER JOIN msdb.dbo.backupmediaset AS ms ON s.media_set_id = ms.media_set_id
INNER JOIN msdb.dbo.backupmediafamily AS mf ON ms.media_set_id = mf.media_set_id
WHERE s.database_name = N'YourDatabaseName'
ORDER BY s.backup_finish_date DESC;
向我们显示您创建备份的代码。但为什么使用浏览器作为转移手段? – Marged
很简单。虽然不安全。 – vasin1987