我将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
。
即使状态字段是只读的并且删除文件的方式正确,如何在删除文件之前更新文件的状态?
答案 0 :(得分:0)
但是您正在使用SMO。作为替代方式,如果可以执行SQL来执行这些操作。我建议只使用TSQL删除类似
的文件ALTER DATABASE SchoolDb2012
REMOVE FILE schoolDataFile1;
GO
找到详细信息
答案 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);
}