【问题标题】:Database collection with smo on sql server 2005, 2008, 2012在 sql server 2005、2008、2012 上使用 smo 收集数据库
【发布时间】:2013-01-09 09:46:08
【问题描述】:

我正在尝试使用 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 的实例,则在检查 database.IsMirroringEnabled 时出现异常:

索引超出了数组的范围。

堆栈跟踪是:在 Microsoft.SqlServer.Management.Smo.SqlPropertyMetadataProvider.PropertyNameToIDLookupWithException(字符串 propertyName, PropertyAccessPurpose pap) 在 Microsoft.SqlServer.Management.Smo.PropertyCollection.LookupID(字符串 propertyName, PropertyAccessPurpose pap) 在 Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(字符串 propertyName, Boolean throwOnNullValue) 在 Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(字符串 属性名称)在 Microsoft.SqlServer.Management.Smo.Database.get_IsSystemObject() 在 RBC.StockManagement.CommunicationService.DatabaseBackup.BackupDatabase(字符串 数据库名称,字符串备份目录)在 D:\Work\Trunk\RBC.StockManagement\RBC.StockManagement.CommunicationService\DatabaseBackup.cs:line 85

我要备份的数据库是从 SqlServer 2005 创建的,我的操作系统在 x64 架构上运行。 2005(开发者版)、2008(速成版)和2012(速成版)这三个实例都在同一台计算机上。

【问题讨论】:

  • This will work if the SqlServer is 2005 or 2008. If i try to connect to an instance of 2008, i am getting an exception - 这句话没有任何意义 - 你的意思是当你连接到 2008 R2 或 2012 的实例时?否则与上句相矛盾。
  • 谢谢!我纠正了!我试图连接到 2012 实例。

标签: c# sql-server smo database-backups


【解决方案1】:

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:

查看此项目,了解微软关于 forward 的官方立场 兼容性(不会修复)和向后兼容性(Denali SSMS 将能够管理 2000、2005、2008、2008 R2): http://connect.microsoft.com/SQLServer/feedback/details/622441

(如果您不知道,Denali 是 2012 年发布之前的代号)。

【讨论】:

  • 谢谢你,Bridge!我替换了 SMO dll。
  • @MariusIstudor 没问题。如果这有帮助,请考虑接受我的回答 - 网站FAQs 中列出了如何做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多