Получение ошибки при восстановлении базы данных SQL с помощью VB.net

Сообщение об ошибке: Не удалось получить монопольный доступ, так как база данных уже используется. восстановление базы данных аварийно завершает работу.

Мой резервный код работает, но я не знаю, почему этот код восстановления не работает.

Try
    Dim con2 As SqlConnection
    Dim com2 As SqlCommand
    Dim filename2 As String
    Dim strquery2 As String
    Dim database2 As String
    Dim get_servername2 As String

    'get the value selected in Database Name Dropdown Menu
    database2 = Database_NameComboBox.Text
    'get the value selected in Server Name Dropdown Menu
    get_servername2 = Server_NameComboBox.Text.Trim

    Dim opendlg As New OpenFileDialog
    Dim constr2 As String

    ' set SQL connection data source using default Master Database
    constr2 = "Data Source=" & get_servername2 & ";Initial Catalog=master;Integrated Security=SSPI"

    ' open SQL Database to restore
    If opendlg.ShowDialog = Windows.Forms.DialogResult.OK Then
        Me.Cursor = Cursors.WaitCursor
        con2 = New SqlConnection(constr2)
        con2.Open()
        filename2 = opendlg.FileName
        strquery2 = "Restore database " & database2 & " from disk='" & filename2 & "'"

        ' execute command
        Try
            com2 = New SqlCommand(strquery2, con2)
            com2.ExecuteNonQuery()
            MessageBox.Show("Database " & database2 & " has been Restored Successfully", "IBP Legal Aid Case Management System - Restore Database", MessageBoxButtons.OK, MessageBoxIcon.Information)
            con2.Close()
            Me.Server_NameComboBox.SelectedIndex = -1
            Me.Database_NameComboBox.SelectedIndex = -1
            Me.Database_NameComboBox.Enabled = False
            Me.Cursor = Cursors.Default
        Catch ex As Exception
            Me.Cursor = Cursors.Default
            MessageBox.Show(ex.Message)
        End Try

    End If

Catch ex As Exception
    Me.Cursor = Cursors.Default
    MessageBox.Show(ex.Message)
End Try

person Jay DC    schedule 18.12.2019    source источник
comment
Вы могли бы открыть другое соединение. Например, здесь, в вашем блоке catch, вы не закрываете соединение. Посмотрите, как использовать оператор Using и изменить шаблон кода повсюду в вашей программе.   -  person Steve    schedule 18.12.2019
comment
Ваш код широко открыт для внедрения sql. Научитесь правильно параметризовать свой код - не имеет значения, будет ли это приложение использоваться только для внутренних целей. Развивайте хорошие привычки.   -  person SMor    schedule 18.12.2019


Ответы (1)


До restore вы должны убедиться, что к этому database не подключен пользователь, иначе вы получите сообщение об ошибке.

Вы можете сначала установить свой db offline, а затем восстановить:

alter database MyDB set offline
with rollback immediate;

restore database ...
person sepupic    schedule 18.12.2019