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());
}
}
答案 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);