我正在尝试执行一个使用CLR程序集的UDF。每当我尝试运行它时,我都会得到以下错误:
Msg 6522,第16层,状态1,第45号线 在执行用户定义的例程或聚合“地理代码”时发生了.NET框架错误: System.NullReferenceException:对象引用没有设置为对象的实例。 在ProSpatial.UserDefinedFunctions.GeocodeUDF(SqlString countryRegion,SqlString adminDistrict,SqlString locality,SqlString postalCode,SqlString addressLine)
它是一个地理编码程序集,基于以下博客:
https://alastaira.wordpress.com/2012/05/04/geocoding-in-sql-server-with-the-bing-maps-locations-api/
我能做些什么来修复它吗?一切都很顺利,但最近才停止工作。我把Bing地图的键改成了新的,但这还没有解决问题。有人有什么想法吗?
干杯
编辑:我在Chrome中输入了一个格式化的URL,以查看是否可以得到错误。我输入了以下URL格式:
我所做的就是用它们各自的条目替换0到5项。我把花括号放在那里,然后也试了一下,没有花括号。没有花括号,URL返回一个没有问题的结果。
在浏览器中,我得到地理编码的结果,但不再使用SQL。
发布于 2020-08-04 11:51:44
刚刚解决好了。正在进行地理编码的地址字段之一在数据库中为null,API不喜欢这样做。所以我把它从地理编码列表中删除了
发布于 2020-08-04 22:33:08
查看该博客中的代码,如果您正在传递一个NULL,那么抛出错误的不是API。发生此错误是因为在首次调用方法时没有处理NULL值。代码只是将SqlString输入参数转换为string,而不首先检查SqlString变量中是否有值。SqlString非常类似于可空的string。
幸运的是,很容易调整代码以正确处理输入参数中的NULL值。从下面原始代码的编辑片段开始,我将展示如何对一个参数执行此操作,您可以为其他参数重复该修改(嗯,那些在DB中实际上可能是NULL的修改;对于由于在NOT NULL列中而保证存在的参数,不需要这样做)。
public static SqlGeography GeocodeUDF(
SqlString countryRegion,
SqlString adminDistrict,
SqlString locality,
SqlString postalCode,
SqlString addressLine
)
{
...
string localAdminDistrict = string.Empty;
if (!adminDistrict.IsNull)
{
localAdminDistrict = adminDistrict.Value;
}
// Attempt to geocode the requested address
try
{
geocodeResponse = Geocode(
(string)countryRegion,
localAdminDistrict,
(string)locality,
(string)postalCode,
(string)addressLine
);
}我所做的就是:
localAdminDistrict添加了一个局部变量,默认为空字符串。if块来设置localAdminDistrict (如果adminDistrict不是null )。Geocode()的调用,以使用localAdminDistrict而不是(string)adminDistrict。只要必应映射API对adminDistrict (即...&adminDistrict=&locality=... )有一个空值就可以工作,而不是adminDistrict没有出现在GET请求中(这很容易,它只需要额外的修改)。
还包括:,只要您要在其中更新代码,就应该将对Close()和Dispose()方法的调用移到try / catch的finally块中。
有关一般使用SQLCLR的更多信息,请访问:SQLCLR信息
https://stackoverflow.com/questions/63232524
复制相似问题