Не удалось получить монопольный доступ, поскольку база данных используется с аутентификацией SQL Server.C#

Место общения программистов C#
Anonymous
Не удалось получить монопольный доступ, поскольку база данных используется с аутентификацией SQL Server.

Сообщение Anonymous »

Я столкнулся со странной проблемой при использовании объекта Сервер. Похоже, что при использовании аутентификации SQL Server при восстановлении выдается сообщение

Не удалось получить исключительный доступ, поскольку база данных используется

Вот полный код для восстановления при нажатии кнопки «Восстановить». См. 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

Вернуться в «C#»