Вы не можете выполнить операцию Удалить на объекте в состоянии Существующий - PullRequest
0 голосов
/ 27 августа 2018

Я использую Visual Studio 2017 с Smoll DLL и пытается удалить файл из файлов базы данных с помощью следующей процедуры

public string RemoveFile(string fileName,string databaseName)
{
   Server srv = new Server(servConn);
    Database database = srv.Databases[databaseName];
    if (database != null)
    {
        var file = LoadFiles(databaseName).Where(a => a.Name == fileName);

        if (!file.Any())
        {
            SqlServerDisconnect();
            return "File  Doesn't  Exist.kindly Enter Right File Name";
        }
        else
        {
            DataFile fileToRemove = file.FirstOrDefault();
            database.FileGroups[fileToRemove.Parent.Name].Files.Remove(fileToRemove);
            database.Alter();

            return "File  Removed Successfully";
        }
    }
}

Я не собираюсь упоминать код параметра servConn и SqlServerDisconnect для сокращения кода, который я использовал в других местах, и я уверен, что он работает хорошо.

Когда я удаляю файл, который берут его имя из логического имени одного из существующих файлов

RemoveFile("File1",MyDataBase")

Я получаю сообщение: You cannot perform operation Remove on an object in state Existing.

Как я могу обновить состояние файла перед его удалением, даже если поле состояния доступно только для чтения и мой способ удаления файла правильный?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

я обновил мою процедуру для удаления файла напрямую, а не из его файловой группы и исключение исчезло

public string RemoveFile(string fileName,string databaseName)
{
   Server srv = new Server(servConn);
    Database database = srv.Databases[databaseName];
    if (database != null)
    {
        var file = LoadFiles(databaseName).Where(a => a.Name == fileName);

        if (!file.Any())
        {
            SqlServerDisconnect();
            return "File  Doesn't  Exist.kindly Enter Right File Name";
        }
        else
        {
            DataFile fileToRemove = file.FirstOrDefault();
            fileToRemove.Drop();
            database.Alter();
            return "File  Removed Successfully";
        }
    }
}
0 голосов
/ 27 августа 2018

Однако вы используете SMO; Для альтернативного способа, если вы можете выполнить SQL для выполнения этих операций. Я бы предложил просто использовать TSQL для удаления файла вроде:

ALTER DATABASE SchoolDb2012  
REMOVE FILE schoolDataFile1;  
GO  

Подробную информацию вы можете найти здесь https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options?view=sql-server-2017

...