【问题标题】:SMO FileGroup.Files produces DuplicateNameExceptionSMO FileGroup.Files 产生 DuplicateNameException
【发布时间】:2015-04-15 15:14:25
【问题描述】:

对于我的 ASP.net 应用程序,我正在实现一种使用 SQL Server 管理对象 (SMO) 库代码自动克隆生产数据库的方法。我通过备份数据库,然后将其还原到同一服务器上的不同数据库来做到这一点。作为其中的一部分,我使用 relocateFiles 集合来指定新数据库的数据文件和日志文件的位置。 这一切都可以在 SQL Server 2008R2 上正常运行;但是,在连接到我的 SQL Server 2012 实例时尝试相同的操作时,我遇到了以下异常:

System.Data.DuplicateNameException "名为 'DatabaseName2' 的列已属于此 DataTable。"

此异常发生在以下代码的第二行:

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.RegisterColumnName(字符串名称,DataColumn 列) 在 System.Data.DataColumnCollection.BaseAdd(DataColumn 列) 在 System.Data.DataColumnCollection.AddAt(Int32 索引,DataColumn 列) 在 Microsoft.SqlServer.Management.Smo.DataProvider.InitSchemaTable(ArrayList parentProperties) 在 Microsoft.SqlServer.Management.Smo.DataProvider.Init(StatementBuilder sb,RetriveMode rm) 在 Microsoft.SqlServer.Management.Smo.ExecuteSql.GetDataProvider(StringCollection 查询,对象 con,StatementBuilder sb,RetriveMode rm) 在 Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillData(ResultType resultType,StringCollection sql,对象 connectionInfo,StatementBuilder 某人) 在 Microsoft.SqlServer.Management.Smo.SqlObjectBase.FillDataWithUseFailure(SqlEnumResult sqlresult,ResultType resultType) 在 Microsoft.SqlServer.Management.Smo.SqlObjectBase.BuildResult(EnumResult 结果) 在 Microsoft.SqlServer.Management.Smo.SqlObjectBase.GetData(EnumResult erParent) 在 Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData() 在 Microsoft.SqlServer.Management.Sdk.Sfc.Environment.GetData(请求 req,对象 ci) 在 Microsoft.SqlServer.Management.Sdk.Sfc.Enumerator.GetData(对象连接信息,请求请求) 在 Microsoft.SqlServer.Management.Smo.ExecutionManager.GetEnumeratorDataReader(请求 req) 在 Microsoft.SqlServer.Management.Smo.SqlSmoObject.InitChildLevel(Urn levelFilter,ScriptingPreferences sp,Boolean forScripting) 在 Microsoft.SqlServer.Management.Smo.SmoCollectionBase.InitializeChildCollection(布尔刷新) 在 Microsoft.SqlServer.Management.Smo.SmoCollectionBase.GetEnumerator() 在[我上面代码的第二行]

我已查询 sys.master_files,但看不到任何重复项。

谁能提出问题可能是什么? 谢谢!

【问题讨论】:

    标签: c# asp.net sql-server smo


    【解决方案1】:

    好的,我从来没有弄清楚导致 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2014-07-03
      相关资源
      最近更新 更多