Не удалось получить исключительный доступ, поскольку база данных используется
Вот полный код для восстановления при нажатии кнопки «Восстановить». См. server.KillAllProcesses(DB_NAME). Если я создам объект сервера следующим образом: Server server=new Server("localhost\PharmSpec"), и когда я восстановлю его, он будет работать нормально даже на виртуальной машине. Но когда я создаю Сервер, используя строку подключения, как показано ниже, происходит сбой.
Строка подключения правильная, потому что я выполняю резервное копирование и архивирование, и эти операции работают нормально. Эта проблема возникает только на виртуальной машине (прокрутите ниже журнал событий), а на локальном компьютере все работает нормально.
Есть идеи, что происходит?
Вот полный код:
Код: Выделить всё
private void Restore_OK_But_Click(object sender, System.EventArgs e)
{
SAForm m_saForm;
string strSAPswd;
string strDate = "04/04/2003";
try
{
// Validate file.
DateTime createddate = Convert.ToDateTime(strDate);
if (DateTime.Now > createddate)
{
string strFile = BackupFile_Txt.Text;
FileInfo FileIn = new FileInfo(BackupFile_Txt.Text);
if (false == FileIn.Exists)
{
MessageBox.Show(m_ResMngr.GetString("InvalidBackupFile"), m_ResMngr.GetString("Error"), MessageBoxButtons.OK,
MessageBoxIcon.Error);
OK_But.Enabled = false;
}
else
{
// Creates SQL file.
WriteFile();
m_saForm = new SAForm();
m_saForm.ShowDialog();
if (true == m_saForm.m_bContinue)
{
// Modified for Bug #719 - TimR 9-15-2008
this.Cursor = Cursors.WaitCursor;
OK_But.Enabled = false;
this.Refresh();
string dbServerName = PharmSpecRegistryHelper.GetDBServerNameFromRegistry(UIService.UIService.PHARMSPEC_DATABASE_REGISTRY_KEY);
SqlConnection connection = new SqlConnection(m_connectionString);
ServerConnection serverConnection = new ServerConnection(connection);
Server server = new Server(serverConnection);
if (server == null)
{
throw new NullReferenceException("Something went wrong");
}
try
{
// Kill all open connections and processes on the PharmSpecDB
server.KillAllProcesses(DB_NAME);
}
catch(Exception ex)
{
// Failed to kill open connections but will try the restore anyway.
}
finally
{
server = null;
}
strSAPswd = m_saForm.m_strsapswd;
string strParams = "-U sa -P " + strSAPswd + " -S " + dbServerName + " -i \"" + Environment.CurrentDirectory + "\\Restore.sql\"";
System.Diagnostics.Process sqlProcess = new System.Diagnostics.Process();
sqlProcess.StartInfo.FileName = oldOSQL;
sqlProcess.StartInfo.Arguments = strParams;
sqlProcess.StartInfo.UseShellExecute = false;
sqlProcess.StartInfo.RedirectStandardOutput = true;
sqlProcess.Start();
string szOutput = sqlProcess.StandardOutput.ReadToEnd();
szOutput = szOutput.Trim(">1234567890 ".ToCharArray());
if (szOutput.StartsWith(m_ResMngr.GetString("Restore_Processed")) == false)
{
throw new Exception(szOutput);
}
else
{
BackupFile_Txt.Text = "";
txt_Quick.Text = "";
int index = strFile.LastIndexOf("\\");
strFile = strFile.Substring(index + 1, strFile.Length - (index + 1));
LogFile(strFile + m_ResMngr.GetString("RestoreSuccess"));
DateTime dt = DateTime.Today;
dt = dt.AddDays(1);
string strRegkeyValue = dt.ToString("MM/dd/yyyy");
EncryptBase64(ref strRegkeyValue);
IniWriteValue("Archive", "ArchivedDate", strRegkeyValue);
//now clean up the log file (.ldf file)
TruncateLDF(strSAPswd);
MessageBox.Show(this, m_ResMngr.GetString("RESTORE_COMPLETE"), m_ResMngr.GetString("COMPLETED"), MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
else
MessageBox.Show(this, m_ResMngr.GetString("invaliddate"), m_ResMngr.GetString("DATE_INVALID"), MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
catch (Exception Exc)
{
WriteToFile(Exc.Message, "Wrong");
// shows Error.
MessageBox.Show(Exc.Message, m_ResMngr.GetString("Error"), MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
finally
{
OK_But.Enabled = true;
this.Cursor = Cursors.Default;
}
}
private void TruncateLDF(string strSAPswd)
{
// read datapath from registry
string strPath = "";
try
{
strPath = PharmSpecRegistryHelper.GetValueFromRegistry(UIService.UIService.PHARMSPEC_DATABASE_REGISTRY_KEY, "DataPath");
char[] charsToTrim = { '\\' };
strPath = strPath.TrimEnd(charsToTrim);
CreateTestFile(strPath);
string strParams = "";
// create detach file
CreateDetachFile();
// create attach file
CreateAttachFile(strPath);
CreateBatchFile(strPath, strSAPswd);
strParams = Environment.CurrentDirectory + "\\DelLog.bat";
System.Diagnostics.Process processDeleteLog = System.Diagnostics.Process.Start(strParams);
processDeleteLog.WaitForExit();
processDeleteLog.Dispose();
}
catch (Exception ex)
{
throw ex;
}
}
[img]https://i. sstatic.net/83ZWd7TK.jpg[/img]
Это полное сообщение об исключении, когда я записываю в файл,
Сообщение: сообщение 3101, уровень 16, состояние 1, сервер DESKTOP-H61UJDR\PHARMSPEC, строка 1
Невозможно получить монопольный доступ, поскольку база данных используется.
Сообщение 3013, уровень 16, состояние 1, сервер DESKTOP-H61UJDR\PHARMSPEC, строка 1
ВОССТАНОВЛЕНИЕ ДАННЫХ завершается ненормально.
Подробнее здесь: https://stackoverflow.com/questions/791 ... with-sql-s