我已经编写了一个完美运行的ASP.Net 4应用程序。但是,我决定在Sql Sever 2012中使用新的地理数据类型。这在我的本地计算机上运行良好,但在上载时失败。
我得到错误" DataReader.GetFieldType(9)返回null。"做一般"选择* FROM表"查询包含这些数据类型之一的表。
我搜索了有关在我的项目中添加对Microsoft.SqlServer.Types.dll的引用并将Copy Local更改为true的各种线程。但是我得到了同样的错误。
我在两个不同的服务器上运行数据库和Web服务器,所以我不认为Web服务器上有任何程序集,除非我用我的项目上传它们。
我是否遗漏了需要的任何其他装配?或任何其他设置?
我花了好几天时间试图解决这个问题并上传variouse库。任何帮助将不胜感激。
答案 0 :(得分:0)
据我所知,当您最初添加引用时,至少需要在本地安装SQL Server。如果可以的话,我会首先尝试在本地安装SQL Express(您不需要只使用它安装它),然后再次尝试使用代码来查看是否存在问题。
参考文献:
DataReader.GetFieldType returned null
http://blogs.bing.com/maps/2013/08/05/advance-spatial-queries-using-entity-framework-5/
修改强>
我更熟悉通过实体框架使用空间类型。看来如果你想直接使用它们,你需要使用nuget包来获得所需的DLL到项目中。来自Microsoft ADO.NET博客页面
SqlServerSpatial110.dll - 这是本机程序集,因此无法将其添加为项目引用。
参考文献:
Microsoft ADO.NET博客
相关的SO问题
'Microsoft.SqlServer.Types' version 10 or higher could not be found on Azure https://gis.stackexchange.com/questions/382/how-can-i-use-sql-servers-spatial-types-from-a-net-application
答案 1 :(得分:0)
当SQL Server 2012中的兼容级别为100或更低时,地理数据类型具有以下限制:
•每个地理实例必须适合单个半球。不能存储大于半球的空间物体。
•来自开放地理空间联盟(OGC)着名文本(WKT)或众所周知的二进制(WKB)表示形式的任何地理实例产生的对象大于半球会抛出ArgumentException。
•如果方法的结果不适合,则需要输入两个地理实例的地理数据类型方法(如STIntersection(),STUnion(),STDifference()和STSymDifference())将返回null一个半球。如果输出超过单个半球,STBuffer()也将返回null。
答案 2 :(得分:0)
花了很多时间在这上面,同时添加了引用,但我找到了一个我想要分享的解决方法。 也应该在asp.net上正常工作。
我使用以下查询来解析对象的字符串表示形式:
DECLARE @result geography;
SELECT @result = area FROM news WHERE id LIKE @id ;
SELECT ..., @result.STAsText() as area FROM news WHERE id LIKE @id;
在asmx(c#)webservice中,我使用解析器方法检索了我的SQLGeography:
row["area"].ToString()
之后,您可以使用解析器方法来检索SQLGeography对象。
/// <summary>
/// Converts a String into an sql geography object.</summary>
/// <param name="pText">The string representation of the sql geography object. </param>
public static SqlGeography GetGeographyFromText(String pText)
{
SqlString ss = new SqlString(pText);
SqlChars sc = new SqlChars(ss);
try
{
if (pText.Contains("POINT"))
{
return SqlGeography.STPointFromText(sc, 4326);
}
return SqlGeography.STPolyFromText(sc, 4326);
}
catch (Exception ex)
{
return SqlGeography.STMPolyFromText(sc, 4326);
throw ex;
}
}
希望它对任何人都有帮助!
答案 3 :(得分:-1)
最后我无法像在开发机器上那样工作,我不想在Web服务器上安装Visual Studio或SQL Server Express,所以我只是删除了我所做的所有查询“SELECT * FROM Table”,错误消失了。它仍然让我使用地理字段进行计算,但不喜欢你试图在屏幕上显示它。谢谢你的帮助!