我已經寫在過去的一個類似的應用。我的方法是創建一個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