【发布时间】: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