访问microsoft . sqlserver . management . sm . server对象的成员恰好崩溃一

本文关键字:成员 崩溃 对象 sqlserver microsoft management sm server 访问 | 更新日期: 2023-09-27 18:10:55

我们试图访问Microsoft.SqlServer.Management.Smo.Server对象的DefaultFile成员。经过大量调试后,结果是第一次访问成员时会崩溃,但随后可以正常访问。在调试窗口中查看变量,第一次返回异常,第二次和以后所有时间返回正确的值。

第一次访问server.DefaultFileserver.DefaultLog都会抛出如下异常:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
 at Microsoft.SqlServer.Management.Smo.BitStorage.SetBit(Int32 itemIndex, BitIndex bitIndex, Boolean value)
 at Microsoft.SqlServer.Management.Smo.PropertyCollection.SetRetrieved(Int32 index, Boolean val)
 at Microsoft.SqlServer.Management.Smo.SqlSmoObject.AddObjectPropsFromDataReader(IDataReader reader, Boolean skipIfDirty, Int32 startColIdx, Int32 endColIdx)
 at Microsoft.SqlServer.Management.Smo.SqlSmoObject.ImplInitialize(String[] fields, OrderBy[] orderby)
 at Microsoft.SqlServer.Management.Smo.SqlSmoObject.Initialize(Boolean allProperties)
 at Microsoft.SqlServer.Management.Smo.SqlSmoObject.OnPropertyMissing(String propname, Boolean useDefaultValue)
 at Microsoft.SqlServer.Management.Smo.PropertyCollection.GetValueWithNullReplacement(String propertyName, Boolean throwOnNullValue, Boolean useDefaultOnMissingValue)
 at Microsoft.SqlServer.Management.Smo.Server.get_DefaultFile()
 at my function... etc etc

第一次访问崩溃是非常一致的,所以做一些像下面这样可怕的事情可以完全绕过这个问题:

using (var sqlConnection = new SqlConnection(sourceDatabaseConnectionString.ConnectionString))
{
    var svrConnection = new ServerConnection(sqlConnection);
    var server = new Server(svrConnection);
    // begin mega hack
    try
    {
        // crashes on first access
        var dummy = server.DefaultFile;
    }
    catch
    {
        // do absolutely nothing
    }
    // end mega hack
    // business as usual...
    var defaultFile = server.DefaultFile;
}
当然,我们不喜欢这样的代码(即使它只是在我们的内部工具中),所以任何关于为什么会发生这种情况的想法都是受欢迎的。我们唯一的线索是,我们最近将一些SQL Server 2012的实例升级到SQL Server 2014。当在安装了SQL Server 2014的机器上本地运行代码时,我们有时可以解决这个问题。运行此代码的生产机器根本没有安装,而是引用dll。但是,在运行代码时调试打印程序集版本时,我们找不到使用的版本有任何差异。

访问microsoft . sqlserver . management . sm . server对象的成员恰好崩溃一

我在使用旧版本的SMO时看到过类似的消息,特别是在试图使用2008R2 SMO访问2012时。从2008R2功能包SP3升级到安装修复了我的问题。

检查是否有可以使用的共享管理对象+ CLR类型+本地客户端驱动程序的最新版本