【问题标题】:SQL CLR for mongodb throwing 'MongoDB.Bson.Serialization.BsonSerializer' exception用于 mongodb 的 SQL CLR 引发“MongoDB.Bson.Serialization.BsonSerializer”异常
【发布时间】:2015-10-07 04:42:06
【问题描述】:

我正在使用 C# 创建一个 SQL CLR 过程来在 MongoDB 上执行一些基本操作,例如获取集合的内容、插入文档等。 但我得到 'MongoDB.Bson.Serialization.BsonSerializer' 的类型初始化程序引发了异常。

有什么想法吗??

来自 C# 的完全相同的代码直接可以正常工作。

我正在为 Mongo 1.10 版、.NET Framework 3.5、Microsoft SQL Server 2008 (RTM) 使用 C# 驱动程序。

您可以在下面找到堆栈跟踪的示例:

无法从数据库中删除集合 错误:“MongoDB.Bson.Serialization.BsonSerializer”的类型初始化程序引发异常。在 MongoDB.Bson.Serialization.BsonSerializer.LookupSerializer(类型类型) 在 MongoDB.Driver.MongoDatabase.RunCommandAs[TCommandResult](IMongoCommand 命令) 在 MongoDB.Driver.MongoDatabase.DropCollection(字符串集合名称) 在 Mongo.Test()

从数据库中获取集合 无法从数据库中获取集合 错误:“MongoDB.Bson.Serialization.BsonSerializer”的类型初始化程序引发异常。在 MongoDB.Bson.Serialization.BsonSerializer.LookupSerializer(类型类型) 在 MongoDB.Driver.MongoCollection.RunCommandAs[TCommandResult](IMongoCommand 命令,ReadPreference readPreference) 在 MongoDB.Driver.MongoCollection.Count(CountArgs args) 在 Mongo.Test()

正在将文档插入集合... 未能插入 DB test_blob 的集合 错误:无法连接到服务器 xx.local:27017:“MongoDB.Bson.Serialization.BsonSerializer”的类型初始化程序在 MongoDB.Driver.Internal.DirectMongoServerProxy.Connect(时间跨度超时,ReadPreference readPreference)处引发异常 在 MongoDB.Driver.Internal.DirectMongoServerProxy.ChooseServerInstance(ReadPreference readPreference) 在 MongoDB.Driver.MongoServer.AcquireConnection(ReadPreference readPreference) 在 MongoDB.Driver.MongoCollection.InsertBatch(类型nominalType,IEnumerable 文档,MongoInsertOptions 选项) 在 MongoDB.Driver.MongoCollection.Insert(类型nominalType,对象文档,MongoInsertOptions 选项) 在 MongoDB.Driver.MongoCollection.Insert[TNominalType](TNominalType 文档) 在 Mongo.Test()

【问题讨论】:

  • 包含MongoDB命名空间的程序集是否注册为EXTERNAL_ACCESSUNSAFE?我相信它在抱怨MongoDB.Bson.Serialization.BsonSerializer 的类构造函数中的某些内容,这应该是以static BsonSerializer() 开头的方法。该方法发生了什么?
  • @srutzky,是的,该程序集不安全。我不知道该方法内部发生了什么,因为该方法来自 MongoDB 的 C# dll 驱动程序。我发现使用支持较新 .NET 框架的较新 sql 版本和最新的 MongoDB 驱动程序 v2.0,上述工作正常。不过,我需要这个才能使用 SQL 2008
  • 嗯,.NET 驱动程序是开源的,所以您可以通过这里了解它在做什么:github.com/mongodb/mongo-csharp-driver/tree/master ;-)。我建议在将 TargetFrameworkVersion 更改为 .NET 3.5 后获取该源并尝试编译它。如果代码使用了 v4.0 或更高版本中的新内容,那么您应该会收到编译错误,因此您会得到答案;-)
  • @srutzky,是的,这是个好主意,但不幸的是,编译错误太多了,无法解决它:P 无论如何,我很可能会寻找其他替代方案,谢谢您的建议
  • 我只是再次查看并注意到关于 1.x 系列是最后一个使用 .NET 3.5 的注释。如果您根据我上面发布的链接获取了最新的,那么它就是 2.x 系列。所以试试这个链接,它是最后一个 1.10.x 版本。这里的代码应该编译为目标已经是 .NET 3.5:github.com/mongodb/mongo-csharp-driver/tree/v1.10.0

标签: c# sql-server mongodb sqlclr


【解决方案1】:

似乎问题,或者至少是其中一部分,是从 .NET Driver for MongoDB 的 2.x 系列开始,目标框架版本更改为 4.5。 p>

所以有两种可能:

  1. 如果您确实需要在 SQL Server 2008 或 2008 R2 中使用此功能,则可以获取 1.10 版 .NET Driver for MongoDB 的源代码,位于:
    https://github.com/mongodb/mongo-csharp-driver/tree/v1.10.0
    这是使用 .NET Framework 3.5 的最后一个版本。

  2. 由于 2.x 系列的 .NET Driver for MongoDB 似乎可以在较新版本的 SQL Server(我假设为 2012 和更新版本)中工作,因此您可以选择:

    • 安装 SQL Server 2014(或即将推出 2016)Express Edition(免费版)
    • 将 2.x 版本的 .NET Driver for MongoDB 加载到该 Express Edition 实例上
    • 然后将链接服务器从 SQL Server 2008 实例设置到 SQL Server 201[2,4,6] Express Edition,因此使用 Express Edition 作为代理

【讨论】:

  • 就像我说的,我使用的是 1.10 版,但它不适合我。至于选项 2,我不是在寻找那种解决方法...... :(
  • @ChrisM 我认为选项 2 并没有那么糟糕 :-(。事实上,我认为它会很好地工作,因为它将 UNSAFE SQLCLR 的东西从外部与主实例隔离开来。对于选项 1,我只是在想,也许进行 1.10 的本地编译可能会提供比 'MongoDB.Bson.Serialization.BsonSerializer' 的类型初始化程序引发异常更明确的错误消息/洞察力。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2012-07-04
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多