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

本文关键字:出错 网站 坐标 Azure ASP 选择地 | 更新日期: 2023-09-27 18:12:36

Azure网站上的ASP.net webform从包含地理字段的表中进行选择。这个字段会导致错误"DataReader.GetFieldType(0) returned null "。下面是创建表的SQL和. aspx . cs文件中的代码。

SQL创建Test Table [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());
    }
}

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

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

其次,如果您试图从地理字段中检索lat/long,则需要将其作为Point进行查询:

SELECT P.Lat, P.Long FROM T

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

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

加载本机程序集所需的操作

部署应用程序它使用空间数据类型到一台没有系统的机器上安装了SQL Server的CLR类型,您还需要部署本机组装SqlServerSpatial110.dll。x86(32位)和x64(64位)已将此程序集的版本添加到项目中SqlServerTypes'x86和SqlServerTypes'x64子目录。本机汇编msvcr100.dll也包括在情况下,c++运行时没有安装。

您需要添加代码来加载这些程序集中的正确程序集运行时(取决于当前的体系结构)。

ASP。. NET应用程序。. NET应用程序,添加以下行Global.asax.cs中的Application_Start方法:

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

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

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