2015-11-04 177 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;