C# SMO FileGroup.Files生成DuplicateNameException
对于我的ASP.net应用程序,我正在使用SQL Server管理对象SMO库代码实现一种自动克隆生产数据库的方法。我是通过备份数据库,然后将其恢复到同一服务器上的另一个数据库来实现的。作为其中的一部分,我使用relocateFiles集合为新数据库指定数据文件和日志文件的位置。 这一切都可以在SQLServer2008R2上正常工作;但是,在连接到我的SQL Server 2012实例时尝试相同操作时,我遇到以下异常: System.Data.DuplicateNameException名为“DatabaseName2”的列已属于此DataTable 此异常发生在以下代码的第二行:C# SMO FileGroup.Files生成DuplicateNameException,c#,asp.net,sql-server,smo,C#,Asp.net,Sql Server,Smo,对于我的ASP.net应用程序,我正在使用SQL Server管理对象SMO库代码实现一种自动克隆生产数据库的方法。我是通过备份数据库,然后将其恢复到同一服务器上的另一个数据库来实现的。作为其中的一部分,我使用relocateFiles集合为新数据库指定数据文件和日志文件的位置。 这一切都可以在SQLServer2008R2上正常工作;但是,在连接到我的SQL Server 2012实例时尝试相同操作时,我遇到以下异常: System.Data.DuplicateNameException名为“
foreach (FileGroup fg in mySourceDatabase.FileGroups){
foreach (DataFile df in fg.Files){
string location = df.FileName;
int extensionLoc = location.IndexOf(".mdf");
if (extensionLoc > 0) {
string newLocation = location.Substring(0, extensionLoc - 1);
newLocation = newLocation + "_clone.mdf";
restoreDB.RelocateFiles.Add(new RelocateFile(df.Name, newLocation));
}
else {
extensionLoc = location.IndexOf(".ndf");
if (extensionLoc > 0) {
string newLocation = location.Substring(0, extensionLoc - 1);
newLocation = newLocation + "_clone.ndf";
restoreDB.RelocateFiles.Add(new RelocateFile(df.Name, newLocation));
}
}
}
}
堆栈跟踪如下所示:
在System.Data.DataColumnCollection.RegisterColumnNameString名称的DataColumn列中
位于System.Data.DataColumnCollection.BaseAddDataColumn列
在System.Data.DataColumnCollection.AddAtInt32索引的DataColumn列
位于Microsoft.SqlServer.Management.Smo.DataProvider.InitSchemaTableArrayList parentProperties
在Microsoft.SqlServer.Management.Smo.DataProvider.InitStatementBuilder sb上,检索模式rm
在Microsoft.SqlServer.Management.Smo.ExecuteSql.GetDataProviderStringCollection查询中,对象con、语句生成器sb、检索模式rm
在Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataResultType resultType、StringCollection sql、对象连接信息、StatementBuilder sb
在Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataWithUseFailureSqlEnumResult sqlresult,ResultType ResultType
位于Microsoft.SqlServer.Management.Smo.SqlObjectBase.BuildResultEnumResult
位于Microsoft.SqlServer.Management.Smo.SqlObjectBase.GetDataEnumResult客户端
位于Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData
在Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetDataRequest请求中,对象ci
在Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetDataObject connectionInfo中,请求
在Microsoft.SqlServer.Management.Smo.ExecutionManager.GetEnumeratorDataReaderRequest请求中
在Microsoft.SqlServer.Management.Smo.SqlSmoObject.InitChildLevelUrn-levelFilter,ScriptingPreferences sp,用于脚本的布尔值
在Microsoft.SqlServer.Management.Smo.SmoCollectionBase.InitializeChildCollectionBoolean刷新中
位于Microsoft.SqlServer.Management.Smo.SmoCollectionBase.GetEnumerator
在[上面我的代码的第二行]
我已经查询了sys.master_文件,但看不到任何重复的文件
有人能提出问题所在吗?
谢谢 好的,我从未设法找出是什么导致FileGroup.Files枚举失败;但我发现,通过检查备份中文件的详细信息,我可以获得相同的信息:
Restore restoreDB = new Restore();
restoreDB.Database = settings.DestDBName;
restoreDB.Action = RestoreActionType.Database;
restoreDB.Devices.AddDevice(defaultBackupDir + backupFileRelativePath, DeviceType.File);
restoreDB.ReplaceDatabase = true;
restoreDB.NoRecovery = false;
DataTable fileList = restoreDB.ReadFileList(destinationServer);
foreach (DataRow row in fileList.Rows) {
RelocateFile file = new RelocateFile();
file.LogicalFileName = row[0].ToString();
// Derive the physical location as the current physical location
string currentLocation = row[1].ToString();
string extension = ".mdf";
int extensionLoc = currentLocation.IndexOf(extension);
if (extensionLoc <= 0) {
extension = ".ldf";
extensionLoc = currentLocation.IndexOf(extension);
}
if (extensionLoc <= 0) {
extension = ".ndf";
extensionLoc = currentLocation.IndexOf(extension);
}
if (extensionLoc <= 0) {
continue;
}
string newLocation = currentLocation.Substring(0, extensionLoc);
newLocation = newLocation + "_clone" + extension;
file.PhysicalFileName = newLocation;
restoreDB.RelocateFiles.Add(file);
}