在Azure ASP.NET网站中选择地理坐标时出错

时间:2015-09-14 15:04:25

标签: c# asp.net sql-server azure azure-sql-database

Azure网站上的ASP.net webform从包含地理字段的表中进行选择。此字段导致错误" DataReader.GetFieldType(0)返回null。"这是用于创建表的SQL和来自.ASPX.CS文件的代码。

用于创建测试表的SQL [T]:

CREATE TABLE [dbo].[T](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [P] [geography] NULL,
 CONSTRAINT [PK_T] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

INSERT INTO T (P) VALUES (geography::Point(51.4618933852762, -0.926690306514502, 4326));

Test.aspx.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string ConnectionStr = "Server=tcp:Server1,1433;Database=DB;User ID=User1;Password=Password1;Trusted_Connection=False;Encrypt=True;Connection Timeout=5;";
        SqlConnection Connection = new SqlConnection(ConnectionStr);
        Connection.Open();

        //string SQL = "SELECT CONVERT(VARBINARY(100), P) P FROM T";
        string SQL = "SELECT P FROM T";

        SqlDataAdapter da = new SqlDataAdapter(SQL, Connection);

        DataTable dt = new DataTable();

        da.Fill(dt);

        Connection.Close();
        Response.Write(dt.Rows[0]["P"].ToString());
    }
}

2 个答案:

答案 0 :(得分:1)

首先,您是否已将SqlServerTypes添加到项目中?这是您的项目“理解”地理数据类型所必需的。 更新详细说明here

其次,如果您尝试从地理区域中检索纬度/经度,则需要将其作为点进行查询:

SELECT P.Lat, P.Long FROM T

答案 1 :(得分:1)

如果必须使用SqlServerTypes,请务必通过它的NuGet包(https://www.nuget.org/packages/Microsoft.SqlServer.Types/)将其提取到您的解决方案中,并且请注意它包含32位和64位版本,请确保您使用的是相同版本正如您在Azure中使用的网站(说明可以在包的readme.htm文件中找到)。

您还可能需要考虑以下内容,取自readme.htm:

  

加载原生程序集所需的操作

     

部署应用程序   它将空间数据类型用于没有'System的机器   安装SQL Server的CLR类型您还需要部署本机   程序集SqlServerSpatial110.dll。 x86(32位)和x64(64位)   此程序集的版本已添加到您的项目下   SqlServerTypes \ x86和SqlServerTypes \ x64子目录。本土的   如果没有C ++运行时,也会包含程序集msvcr100.dll   安装。

     

您需要添加代码以加载其中正确的其中一个程序集   运行时(取决于当前架构)。

     

ASP.NET应用程序对于ASP.NET应用程序,请添加以下行   代码到Global.asax.cs中的Application_Start方法:

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
     

桌面应用程序对于桌面应用程序,请添加以下行   在执行任何空间操作之前运行的代码:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);