从Azure Function中的Azure SQL访问几何列时出错

时间:2018-08-07 02:08:42

标签: c# azure azure-sql-database azure-functions sqlgeography

我有一个访问Azure SQL数据库的Azure函数。数据库中的第42列属于Geography数据类型(这就是问题所在)。

这是我正在运行的代码:

// var datatable = DataTable();
// Filled 'datatable' from a database query

string json = Newtonsoft.Json.JsonConvert.SerializeObject(dataTable, Newtonsoft.Json.Formatting.Indented);
return new HttpResponseMessage(HttpStatusCode.OK) 
{
    Content = new StringContent(json, Encoding.UTF8, "application/json")
}; 

我收到此错误消息:

  

执行函数时发生异常:Functions.GetRepeaterDetails。   Microsoft.Azure.WebJobs.Script:发生一个或多个错误。   System.Data:DataReader.GetFieldType(42)返回null。

我已经花了几个小时进行搜索,并尝试其他人声称可以解决的问题,但没有一个能解决我的问题。

我在another forum上阅读了这篇文章:

  

请注意,您的示例可以使用,但是无法使用网络   从SQL Azure检索几何的应用程序,因为SQL Azure   当前以兼容级别运行Denali(SQL Server 2012)   100;因此它将返回10.0空间类型和   尝试将其强制转换为11.0时,网络角色将引发异常。

我尝试过的一些事情:

  1. 将Microsoft.SqlServer.Types v14.0.314.76添加到project.json(还尝试了其他几个版本。
  2. 将HashFoo.SqlServer.SpatialTypes v10.0.0添加到project.json
  3. 将Azure SQL Server兼容性级别更改为110。

即使我可以看到服务器正在通过Nuget安装适当的引用,但错误消息仍然相同。

1 个答案:

答案 0 :(得分:2)

我不知道确切地加载哪个程序集来完成该工作,但是您可以通过使用查询中的.ToString()函数将该列转换为WKT来避免该问题。

由于您要格式化JSON格式的结果,因此无论如何都可能是您想要的。

例如

select ...., geo_location.ToString() geo_location, . . .
from some_table

您也可以只拥有SQL Server Return Query Results as JSON