首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2012程序集执行失败- System.NullReferenceException:对象引用未设置为对象实例

问Server 2012程序集执行失败- System.NullReferenceException:对象引用未设置为对象实例
EN

Stack Overflow用户
提问于 2020-08-03 15:38:05
回答 2查看 133关注 0票数 1

我正在尝试执行一个使用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格式:

http://dev.virtualearth.net/REST/v1/Locations?countryRegion={0}&adminDistrict={1}&locality={2}&postalCode={3}&addressLine={4}&key={5}&output=xml

我所做的就是用它们各自的条目替换0到5项。我把花括号放在那里,然后也试了一下,没有花括号。没有花括号,URL返回一个没有问题的结果。

在浏览器中,我得到地理编码的结果,但不再使用SQL。

EN

回答 2

Stack Overflow用户

发布于 2020-08-04 11:51:44

刚刚解决好了。正在进行地理编码的地址字段之一在数据库中为null,API不喜欢这样做。所以我把它从地理编码列表中删除了

票数 0
EN

Stack Overflow用户

发布于 2020-08-04 22:33:08

查看该博客中的代码,如果您正在传递一个NULL,那么抛出错误的不是API。发生此错误是因为在首次调用方法时没有处理NULL值。代码只是将SqlString输入参数转换为string,而不首先检查SqlString变量中是否有值。SqlString非常类似于可空的string。

幸运的是,很容易调整代码以正确处理输入参数中的NULL值。从下面原始代码的编辑片段开始,我将展示如何对一个参数执行此操作,您可以为其他参数重复该修改(嗯,那些在DB中实际上可能是NULL的修改;对于由于在NOT NULL列中而保证存在的参数,不需要这样做)。

代码语言:javascript
复制
    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
        );
      }

我所做的就是:

  1. 为localAdminDistrict添加了一个局部变量,默认为空字符串。
  2. 添加了一个if块来设置localAdminDistrict (如果adminDistrict不是null )。
  3. 更新了对Geocode()的调用,以使用localAdminDistrict而不是(string)adminDistrict。

只要必应映射API对adminDistrict (即...&adminDistrict=&locality=... )有一个空值就可以工作,而不是adminDistrict没有出现在GET请求中(这很容易,它只需要额外的修改)。

还包括:,只要您要在其中更新代码,就应该将对Close()和Dispose()方法的调用移到try / catch的finally块中。

有关一般使用SQLCLR的更多信息,请访问:SQLCLR信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63232524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档