【问题标题】:Error selecting geography coordinate in Azure ASP.NET website在 Azure ASP.NET 网站中选择地理坐标时出错
【发布时间】:2015-09-14 15:04:24
【问题描述】:

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

创建测试表的 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());
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    SELECT P.Lat, P.Long FROM T
    

    【讨论】:

    • 没有。我已将它添加到 packages.config 和 bin 文件夹中,但它仍然无法处理它。我可能能够将它作为一个字节数组并将其转换为字符串。在本地,它以十六进制字符串的形式返回。前任。 0x1AB3A21223....
    • 我已经更新了我的答案,其中包含安装 SqlServerTypes 的详细说明的链接。
    • 另一种选择是使用 STAsText() 更改 SQL 查询以返回字符串。 SELECT P.STAsText() FROM T. 参考:msdn.microsoft.com/en-us/library/bb933970.aspx
    • 我会将其标记为答案,但我仍然无法让 SqlServerTypes 在 Azure 网站上运行。我必须使用 STAsText() 才能让事情正常进行。 Azure 仍然很新,以至于 SQL 和 ASP.NET 网站与自托管解决方案并不完全相同。另外值得注意的是,这个网站是通过 FTP 上传的,而不是通过 Visual Studio 发布的,所以事情与那里的所有说明都有点不同。
    • Azure 已经 5 岁了,我不会认为它“那么新”。 SQL Azure 和 SQL Server 之间确实存在差异,但我认为你需要对 Geography 做些什么。我很想知道为什么您通过 FTP 部署而不是使用 VS 发布,尽管就最终在 Azure 上的最终位而言,这应该没有任何区别。
    【解决方案2】:

    如果您必须使用 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 子目录。本地人 如果没有 C++ 运行时,还包括程序集 msvcr100.dll 安装。

    您需要添加代码以在以下位置加载正确的这些程序集之一 运行时(取决于当前架构)。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-23
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多