2

次のように、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 をチェックするときに例外が発生します。

インデックスが配列の範囲外だった。

スタック トレースは次のとおりです。 RBC.StockManagement.CommunicationService.DatabaseBackup で Microsoft.SqlServer.Management.Smo.Database.get_IsSystemObject() で Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(String propertyName) で Smo.PropertyCollection.GetValueWithNullReplacement(String propertyName, Boolean throwOnNullValue) .BackupDatabase(String databseName, String backupDirectory) in D:\Work\Trunk\RBC.StockManagement\RBC.StockManagement.CommunicationService\DatabaseBackup.cs:line 85

バックアップしようとしているデータベースは SqlServer 2005 から作成されており、オペレーティング システムは x64 アーキテクチャで実行されています。2005 (開発者版)、2008 (高速版)、および 2012 (高速版) の 3 つのインスタンスはすべて同じコンピューター上にあります。

4

1 に答える 1

4

この MSDN の記事から、SQL Server 2012 に同梱されている新しい SMO DLL があり、古いものを使用して 2012 インスタンスに接続しようとすると機能しないことがわかります。

古いバージョンの SQL Server の SMO dll への参照を削除し、SQL Server 2012 で提供される新しい SMO dll への参照を含める必要があります。

最低限、以下を参照します。

  • Microsoft.SqlServer.ConnectionInfo

  • Microsoft.SqlServer.Smo

  • Microsoft.SqlServer.Management.Sdk.Sfc

この関連する Connect の記事では、接続しようとしているエラーについて具体的に言及しているため、これは同じ問題であると推測しています。MS は、2012 に接続できるように古いものを更新しないと言っているので、新しい SMO DLL に更新するのが最善の策だと思います。

通常の SO 貢献者 Aaron bertrand から:

前方互換性 (修正予定なし) および後方互換性 (デナリ SSMS は 2000、2005、2008、2008 R2 を管理できるようになります) に関する Microsoft の公式見解については、次の項目を参照してください: http://connect.microsoft.com/SQLServer/feedback /詳細/622441

(デナリは、リリース前の 2012 年のコードネームでした。ご存じない場合があります)。

于 2013-01-09T10:43:03.920 に答える