您无法对状态为“现有”的对象执行“删除”操作

时间:2018-08-27 14:03:10

标签: c# smo

我将Visual Studio 2017与smo 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

即使状态字段是只读的并且删除文件的方式正确,如何在删除文件之前更新文件的状态?

3 个答案:

答案 0 :(得分:0)

但是您正在使用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

找到详细信息

答案 1 :(得分:0)

我更新了我的程序以直接删除文件,而不是从文件组中删除文件 并且异常消失了

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";
        }
    }
}

答案 2 :(得分:0)

可以使用SetState更改SmoObject状态 例如

 var removeColumn = target.Columns.OfType<Column>().Where(x => !source.Columns.Contains(x.Name)).ToList();
 foreach (Column columItem in removeColumn)
        {
             //If you want remove this item just replace Remove to SetState  
            columItem.SetState(SqlSmoState.ToBeDropped);
            //If I use Remove will got You cannot perform operation Remove on an object in state Existing
            //target.Columns.Remove(columItem.Name);
        }