在ASP.Net中使用SQL Server 2012地理数据类型 - DataReader.GetFieldType(x)返回null

时间:2014-08-26 12:15:14

标签: asp.net sql-server

我已经编写了一个完美运行的ASP.Net 4应用程序。但是,我决定在Sql Sever 2012中使用新的地理数据类型。这在我的本地计算机上运行良好,但在上载时失败。

我得到错误" DataReader.GetFieldType(9)返回null。"做一般"选择* FROM表"查询包含这些数据类型之一的表。

我搜索了有关在我的项目中添加对Microsoft.SqlServer.Types.dll的引用并将Copy Local更改为true的各种线程。但是我得到了同样的错误。

我在两个不同的服务器上运行数据库和Web服务器,所以我不认为Web服务器上有任何程序集,除非我用我的项目上传它们。

我是否遗漏了需要的任何其他装配?或任何其他设置?

我花了好几天时间试图解决这个问题并上传variouse库。任何帮助将不胜感激。

4 个答案:

答案 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博客

http://blogs.msdn.com/b/adonet/archive/2013/12/09/microsoft-sqlserver-types-nuget-package-spatial-on-azure.aspx

相关的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)

msdn

当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”,错误消失了。它仍然让我使用地理字段进行计算,但不喜欢你试图在屏幕上显示它。谢谢你的帮助!