2015-07-17 2 views
2

J'utilise C# pour créer une procédure SQL CLR pour effectuer certaines opérations de base sur MongoDB comme obtenir le contenu d'une collection, insérer un document, etc. mais je reçois L'initialiseur de type pour 'MongoDB.Bson.Serialization.BsonSerializer' a généré une exception.SQL CLR pour lancer mongodb 'MongoDB.Bson.Serialization.BsonSerializer' exception

Des idées?

Le code exact de C# fonctionne directement. J'utilise le pilote C# pour Mongo version 1.10, .NET Framework 3.5, Microsoft SQL Server 2008 (RTM).

Ci-dessous vous pouvez trouver un échantillon de la trace de la pile:

Impossible de supprimer la collection de DB Erreur: Le type initialiseur pour 'MongoDB.Bson.Serialization.BsonSerializer' a jeté une exception. à MongoDB.Bson.Serialization.BsonSerializer.LookupSerializer (type Type) à MongoDB.Driver.MongoDatabase.RunCommandAs [TCommandResult] (commande IMongoCommand) à MongoDB.Driver.MongoDatabase.DropCollection (String collectionName) à Mongo.Test()

Obtenir Collections de DB Impossible d'obtenir la collecte de données erreur: Le type initialiseur pour « MongoDB.Bson.Serialization.BsonSerializer » a lancé une exception. à MongoDB.Bson.Serialization.BsonSerializer.LookupSerializer (type Type) à MongoDB.Driver.MongoCollection.RunCommandAs [TCommandResult] (commande IMongoCommand, ReadPreference readPreference) à MongoDB.Driver.MongoCollection.Count (CountArgs args) à mongo. test()

Insertion document collection ... Impossible d'insérer dans la collection de DB test_blobs erreur: Impossible de se connecter au serveur xx.local: 27017: le type initialiseur pour « MongoDB.Bson.Serialization.BsonSerializer 'a jeté une exception .. à MongoDB.Driver.Internal.DirectMongoServerProxy.Connect (TimeSpan timeout, ReadPreference readPreference) à MongoDB.Driver.Internal.DirectMongoServerProxy.ChooseServerInstance (ReadPreference readPreference) à MongoDB.Driver.MongoServer.AcquireConnection (ReadPreference readPreference) à MongoDB.Driver.MongoCollection.InsertBatch (Type nominalType, documents IEnumerable, options MongoInsertOptions) à MongoDB.Driver.MongoCollection.Insert (Type nominalType, document de l'objet, MongoInsertOptions options) à MongoDB.Driver.MongoCollection.Insert [TNominalType] (document TNominalType) à Mongo.Test()

+0

L'assemblage contenant le 'espace de noms MongoDB' enregistré comme' EXTERNAL_ACCESS' ou 'UNSAFE'? Je crois qu'il se plaint de quelque chose dans le constructeur de classe pour 'MongoDB.Bson.Serialization.BsonSerializer' qui devrait être la méthode commençant par' static BsonSerializer() '. Que se passe-t-il dans cette méthode? –

+0

@srutzky, Oui, l'assemblage est UNSAFE. Je ne sais pas ce qui se passe à l'intérieur de cette méthode, car celle-ci provient du pilote C# dll de MongoDB. J'ai découvert qu'avec une version plus récente de sql qui soutient le cadre .NET plus nouveau et avec le dernier pilote v2.0 de MongoDB, le dessus fonctionne très bien. Cependant, j'ai besoin de cela pour travailler avec SQL 2008 –

+0

Eh bien, le pilote .NET est open source, donc vous pouvez savoir ce qu'il fait en allant ici: https://github.com/mongodb/mongo-csharp-driver/tree/maître ;-). Je suggère de saisir cette source et d'essayer de la compiler après avoir changé le 'TargetFrameworkVersion' en .NET 3.5. Si le code utilise quelque chose de nouveau dans v4.0 ou plus récent, alors vous devriez obtenir une erreur de compilation et donc votre réponse ;-) –

Répondre

2

il semble que la question, ou au moins une partie de celui-ci, est que, à partir du 2. x série du pilote .NET pour MongoDB, la version de la structure cible a été modifiée en version 4.5.

Donc, il y a deux possibilités:

  1. Si vous avez vraiment besoin pour obtenir ce travail dans SQL Server 2008 ou 2008 R2, vous pouvez récupérer le code source pour 1.10 version du pilote .NET pour MongoDB, trouvé à:
    https://github.com/mongodb/mongo-csharp-driver/tree/v1.10.0
    C'est la dernière version à utiliser.NET Framework Version 3.5.

  2. Comme il semble que la série 2.x du pilote .NET pour MongoDB fonctionne dans les nouvelles versions de SQL Server (2012 et plus récent, je suppose), vous avez la possibilité de:

    • installation de SQL Server 2014 (ou bientôt 2016) express Edition (la version gratuite)
    • charger une version 2.x du pilote .NET pour MongoDB sur cette instance express Edition
    • puis mettre en place un serveur lié à partir du Instance SQL Server 2008 à SQL Server 201 [2,4,6] Express Edition, et donc utiliser l'édition Express comme proxy
+0

Comme je l'ai dit, j'ai utilisé la version 1.10 et il n'a pas travaille pour moi. Quant à l'option 2, je ne cherche pas ce genre de solution de contournement ... :( –

+0

@ChrisM Je ne pensais pas que l'option 2 était si mauvaise :-(. En fait, je pense que ça marcherait bien comme il isole le contenu UNSAFE SQLCLR de l'instance principale, pour l'option 1, je pensais que faire une compilation locale de 1.10 pourrait donner des messages d'erreur/insight plus explicites que l'initialiseur de type pour 'MongoDB.Bson.Serialization.BsonSerializer 'a jeté une exception._ –