J'essaie d'utiliser les types CLR SqlServer Spatial dans un projet C # .Net .. Je veux utiliser SqlGeometry pour interroger des enregistrements spatiaux dans ma base de données.
Je travaille sur ma machine locale dans un test unitaire exécuté dans Visual Studio 2010 et qui frappe une machine SqlServer distante. Tout bon.
Je publie ensuite un service de repos WCF sur mon instance locale IIS dont le service utilise la même bibliothèque de classes que le test unitaire pour effectuer une interrogation spatiale et échoue.
Je reçois une erreur en disant
Impossible de charger DLL SqlServerSpatial.dll: le module spécifié pourrait ne pas être trouvé.
J'ai googlé ceci et trouvé beaucoup, beaucoup de réponses - aucune ne fonctionne pour moi .
La seule chose que je n’ai pas faite et que j’ai franchement refusée, c’est d’installer quoi que ce soit sur la boîte SqlServer. Cela me semble inutile.
À ce stade, la seule chose qui me semble responsable est un problème d'autorisations, car il s'exécute dans un pool d'applications IIS et non dans Studio où il fonctionne dans le test unitaire.
Notez que dans mon projet, je ne fais JAMAIS référence à la DLL mentionnée dans le message d'erreur. Cette dll est présente sur la boîte SQL mais je ne peux pas l’ajouter au studio car cela donne un message lorsque j’essaie de .. .. Je n’ai plus rien à essayer ici. Il est 90 dll enfer tout recommencer.
J'ai eu le même problème sur un ordinateur Windows Server 2012. Il y avait un fichier SqlServerSpatial110.dll dans\Windows\System32, mais pas SqlServerSpatial.dll. La solution consistait à installer les types de CLR du système Microsoft pour SQL Server 2008 R2 sur la machine.
Cochez l'un de ces en fonction de votre architecture de processeur:
Cliquez Suivant
Mon problème était similaire au vôtre: j'ai installé mon projet ASP.NET MVC sur une machine virtuelle Azure distante et j'ai cette exception:
"Unable to load DLL 'SqlServerSpatial110.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)"
Pour résoudre le problème, j'ai suivi ces étapes:
J'ai ajouté la référence au paquet manquant dans mon projet:
PM> Install-Package Microsoft.SqlServer.Types
Ensuite, j'ai forcé l'option "Copier dans le répertoire de sortie" sur "Copier toujours" pour le SqlServerSpatial110.dll
( probablement cette étape n'est pas strictement requise ... )
Pour les projets ASP.NET, vous devez ajouter la ligne de code suivante à la méthode Application_Start
dans Global.asax.cs
:
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
Cette dernière étape était fondamentale pour moi, car sans cette ligne de code, la DLL n’est pas chargée par l’application Web.
J'utilise Microsoft.SqlServer.Types.dll
dans les applications WPF et ASP.NET pour travailler avec le type SqlGeometry
et les requêtes spatiales depuis des années (depuis la v.10). Voici les dernières astuces que j'ai trouvées pour charger avec succès le SqlServerSpatialXXX.dll
parmi les conditions préalables. du Microsoft.SqlServer.Types.dll
.
SqlGeometry
et SqlGeography
peuvent être utilisés dans les projets VS (par exemple, C #) en faisant référence au Microsoft.SqlServer.Types.dll
.Microsoft.SqlServer.Types.dll
est une bibliothèque gérée dont certaines prérequis sont des bibliothèques non gérées, comme SqlServerSpatialXXX.dll et msvcrXXX.dll. Microsoft.SqlServer.Types.dll
sont disponibles. Cependant, aucune fonctionnalité ne sera modifiée à partir de 2012.Considérons les problèmes 64 bits/32 bits
Erreur lors du chargement de SqlServerSpatialXXX.dll
Vous pouvez vérifier le problème 32 bits/64 bits au moment de l'exécution en C # à l'aide de Environment.Is64BitProcess
. Voici un exemple de code:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);
private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName)
{
var path = Path.Combine(nativeBinaryPath, assemblyName);
if (!File.Exists(path))
{
throw new FileNotFoundException($"{path} not found");
}
var ptr = LoadLibrary(path);
if (ptr == IntPtr.Zero)
{
throw new Exception(string.Format(
"Error loading {0} (ErrorCode: {1})",
assemblyName,
Marshal.GetLastWin32Error()));
}
}
public static void LoadNativeAssembliesv13(string rootApplicationPath)
{
var nativeBinaryPath = Environment.Is64BitProcess
? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\")
: Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\");
LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll");
LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial130.dll");
}
Considérez le chemin binaire dans différents types de projets Il est recommandé d’avoir un dossier nommé SqlServerTypes dans le chemin d’exécution de votre projet, comme ceci:
SqlServerTypes> x64
SqlServerTypes> x32
et charger des assemblages non gérés comme celui-ci
Utilities.LoadNativeAssembliesv13(Environment.CurrentDirectory); //WPF
Utilities.LoadNativeAssembliesv13(HttpRuntime.BinDirectory); //ASP.NET
Problèmes liés à l'utilisation de ADO.NET pour lire SqlGeometry à partir de Sql Server Malgré la version de Microsoft.SqlServer.Types.dll
que vous utilisez, si vous essayez de lisez-les à partir de Sql Server en utilisant ADO.NET une exception de distribution, car SQL Client charge par défaut la version 10.0.0.0 de Microsoft.SqlServer.Types.dll
. Dans ce cas, il y a quelques années, j'ai essayé WKB (approche 1 et 2) et WKT en tant que moyen de conversion entre les types SqlGeometry
pour une version différente de Microsoft.SqlServer.Types.dll
et que WKB est environ 10 fois plus rapide. le programme pour charger la version que nous utilisons et en utilisant une distribution simple nous pouvons obtenir la SqlGeometry
(approche 3)
private List<SqlGeometry> SelectGeometries(string connectionString)
{
SqlConnection connection = new SqlConnection(connectionString);
var command = new SqlCommand(select shapeCol from MyTable, connection);
connection.Open();
List<SqlGeometry> geometries = new List<SqlGeometry>();
SqlDataReader reader = command.ExecuteReader();
if (!reader.HasRows)
{
return new List<SqlGeometry>();
}
while (reader.Read())
{
//approach 1: using WKB. 4100-4200 ms for hundred thousands of records
//geometries.Add(SqlGeometry.STGeomFromWKB(new System.Data.SqlTypes.SqlBytes((byte[])reader[0]), srid).MakeValid());
//approach 2: using WKB. 3220 ms for hundred thousands of records
//geometries.Add(SqlGeometry.Deserialize(reader.GetSqlBytes(0)));
//approach 3: exception occur if you forget proper Assembly redirection. 2565 ms for hundred thousands of records
geometries.Add((SqlGeometry)reader[0]);
}
connection.Close();
return geometries;
}
Je rencontrais des problèmes sur un ordinateur Windows Server 2008 R2 (machine virtuelle Azure), mais aucune des étapes ci-dessus n'a permis de résoudre le problème. J'ai installé les types CLR. Je mets les fichiers dans le dossier BIN de mon application Web. Toujours rien. Je suis finalement tombé sur ce blog de Microsoft et cela a fonctionné. Je laisse l'URL ici au cas où cela pourrait aider quelqu'un d'autre.
Comme le lien ci-dessus ne fonctionne plus (merci MSFT!), J'ai mis les instructions ci-dessous:
Ce paquet installera les fichiers .DLL nécessaires dans votre solution/projet. Il va également copier des bibliothèques supplémentaires directement dans votre répertoire/bin. Vous devez connecter des références à ces bibliothèques supplémentaires dans votre fichier global.asax.cs/vb. Il y a des instructions sur la façon de faire ceci incluses dans le paquet NuGet. Vous trouverez ci-dessous un lien direct vers le package NuGet (si tout va bien, MSFT n’ajoute rien à cela).
Bien que SQL Server 14.x soit installé, VS n’a pas cessé d’insister sur le fait que SqlServerSpatial 110 .dll était introuvable.
L'installation de types de CLR système de Microsoft pour SQL Server 2008 R2 ne corrigeait rien. J'ai également essayé d'installer la version 10.5 de Microsoft.SqlServer.Types
, mais j'ai reçu une erreur PInvoke à propos de la non correspondance de la signature de méthode.
Donc, au lieu de cela, j’ai installé Microsoft.SqlServer.Types
14.x, puis renommé le fichier SqlServerSpatial 140 .dll en SqlServerSpatial 110 .dll dans les dossiers/x86 et/x64 et fait de même dans Loader.cs
. Pour une raison quelconque, cela semblait faire l'affaire.
J'ai eu le même problème dans GoDaddy VPS avec Windows Server 2012 R2
I Resolved it by Updating my EF5 to EF6
dans la console du gestionnaire de paquets, sur EF5 vers EF lalest
Install-Package EntityFramework
Supprimez le Microsoft.SqlServer.Types.dll des références et utilisez Nuget pour l'installer. Vérifiez votre version avant l'installation. Les assemblages x86 et x64 seront installés dans le projet.