我正在使用 asp.net和sql server 构建项目。 这是3层申请。我想为admin用户提供设备来备份数据库。 数据库应该可以从浏览器下载。 为此我在sql server中使用备份查询。它将数据库的备份放在服务器端,然后用户可以从链接下载.BAK文件。 但是,当数据库的大小超过1/2 GB时,“超时异常”正在发生,并且未在服务器端创建备份。我在连接字符串中增加了超时时间,但没有工作。 我不想要预定备份。应在用户需要时创建备份,并且备份应由用户下载。
伙计们请帮帮我..并提前感谢
答案 0 :(得分: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'
您可以通过运行此查询来获取备份文件名:
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;