我正在尝试使用smo获取数据库集合,如下所示:
var server = GetDatabaseServer();
DatabaseCollection databaseCollection = server.Databases;
foreach (Database database in databaseCollection)
{
if (String.Equals(database.Name, databseName,
StringComparison.OrdinalIgnoreCase))
{
if (database.IsSystemObject == false &&
database.IsMirroringEnabled == false)
{
if (IsTimeForBackup(database.LastBackupDate))
Backup(database, server, backupDirectory);
break;
}
}
}
如果SqlServer是2005或2008,这将有效。如果我尝试连接到2012的实例,我检查数据库时会出现异常.IsMirroringEnabled:
索引超出了数组的范围。
堆栈跟踪是:at Microsoft.SqlServer.Management.Smo.SqlPropertyMetadataProvider.PropertyNameToIDLookupWithException(字符串 propertyName,PropertyAccessPurpose pap)at Microsoft.SqlServer.Management.Smo.PropertyCollection.LookupID(字符串 propertyName,PropertyAccessPurpose pap)at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(字符串 propertyName,Boolean throwOnNullValue)at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(字符串 propertyName)at Microsoft.SqlServer.Management.Smo.Database.get_IsSystemObject()at RBC.StockManagement.CommunicationService.DatabaseBackup.BackupDatabase(字符串 databseName,String backupDirectory)in d:\工作\干线\ RBC.StockManagement \ RBC.StockManagement.CommunicationService \ DatabaseBackup.cs:行 85
我尝试备份的数据库是从SqlServer 2005创建的,我的操作系统是在x64架构上运行的。 2005年(开发人员版),2008年(快车版)和2012年(快车版)的所有三个实例都在同一台计算机上。
答案 0 :(得分:3)
从this MSDN article看,SQL Server 2012附带了新的SMO DLL,如果您尝试使用旧版本连接到2012年的实例,它将无效。
旧版SQL Server中对SMO dll的引用必须是 已删除,以及对SQL提供的新SMO dll的引用 必须包含Server 2012。
最低限度,您可以参考以下内容:
Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Smo
Microsoft.SqlServer.Management.Sdk.Sfc
This related Connect article特别提到了你试图连接的错误 - 所以我猜这是同样的问题。 MS说那里他们不会更新旧版本以允许他们连接到2012,所以我想更新到新的SMO DLL是你最好的镜头。
来自常规SO贡献者Aaron bertrand:
请参阅此项目,了解微软关于前进的官方立场 兼容性(不会修复)和向后兼容性(Denali SSMS将能够管理2000年,2005年,2008年,2008年R2): http://connect.microsoft.com/SQLServer/feedback/details/622441
(Denali是2012年发布之前的代码名称,如果您不知道的话)。