Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SMO FileGroup.Files生成DuplicateNameException_C#_Asp.net_Sql Server_Smo - Fatal编程技术网

C# SMO FileGroup.Files生成DuplicateNameException

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名为“

对于我的ASP.net应用程序,我正在使用SQL Server管理对象SMO库代码实现一种自动克隆生产数据库的方法。我是通过备份数据库,然后将其恢复到同一服务器上的另一个数据库来实现的。作为其中的一部分,我使用relocateFiles集合为新数据库指定数据文件和日志文件的位置。 这一切都可以在SQLServer2008R2上正常工作;但是,在连接到我的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.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);
}