2015-11-04 175 views
1

我正在使用asp.net和sql server建設項目。 它是3層應用程序。我想給管理員用戶提供設備來備份數據庫。數據庫應該可以從瀏覽器下載。 爲此,我在SQL Server中使用備份查詢。將數據庫的備份置於服務器端,然後用戶可以從鏈接下載.BAK文件。 但是當數據庫的大小超過大約1/2 GB「超時異常」發生並且未在服務器端創建備份時。我在連接字符串中增加了超時時間,但沒有奏效。 我不想安排備份。備份應該在用戶需要時創建並且備份應該可以由用戶下載。如何讓用戶備份數據庫

傢伙請幫我。並且在此先感謝

+1

向我們顯示您創建備份的代碼。但爲什麼使用瀏覽器作爲轉移手段? – Marged

+0

很簡單。雖然不安全。 – vasin1987

回答

1

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