Sql server SQL 2008 CLR和Bing映射

Sql server SQL 2008 CLR和Bing映射,sql-server,web-services,clr,bing-maps,sqlclr,Sql Server,Web Services,Clr,Bing Maps,Sqlclr,我已经开发了一个小型的C应用程序,它可以让我使用Bing的地理编码服务对地址表进行地理编码,该服务被配置为服务参考。我已加载程序集,但当我尝试通过存储过程调用它时,收到以下错误: A .NET Framework error occurred during execution of user-defined routine or aggregate "Geocoder": System.InvalidOperationException: Could not find endpoint ele

我已经开发了一个小型的C应用程序,它可以让我使用Bing的地理编码服务对地址表进行地理编码,该服务被配置为服务参考。我已加载程序集,但当我尝试通过存储过程调用它时,收到以下错误:

A .NET Framework error occurred during execution of user-defined routine or aggregate "Geocoder": 
System.InvalidOperationException: Could not find endpoint element with name 'BasicHttpBinding_IGeocodeService' and contract 'BingMapsGeo.IGeocodeService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this name could be found in the client element.
System.InvalidOperationException: 
   at System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName)
   at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address)
   at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress)
   at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName)
   at System.ServiceModel.EndpointTrait`1.CreateSimplexFactory()
   at System.ServiceModel.EndpointTrait`1.CreateChannelFactory()
   at System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait)
   at System.ServiceModel.ClientBase`1.InitializeChannelFactoryRef()
   at System.ServiceModel.ClientBase`1..ctor(String endpointConfigurationName)
   at Geocoder.BingMapsGeo.GeocodeServiceClient..ctor(String endpointConfigurationName)
   at Geocoder.UserDefinedFunctions.geocode(SqlString AddressLine, SqlString City, SqlString State, SqlString Zip)
我相当肯定实际的C程序集是正确的,但我认为我缺少了一些关于实际web服务的东西

我一直在到处寻找解决方案,但没有找到一个似乎有效的

我正在使用最新补丁和.NET版本在服务器2008R2上运行SQL 2008R2


任何想法都是非常受欢迎的。

从SQLCLR进行Web服务调用是可能的,但总是一个坏主意。SQL Server资源在等待Internet响应时被阻止是非常宝贵的。最终,从SQLCLR执行此操作的好处是零,除了一个可疑的冷却因素。此外,不支持将WCF加载到SQLCLR中,请参阅。最后,SQLCLR程序集无法看到任何.config配置部分。将配置放在sqlservr.exe.config中有一个已知的解决方法,但也不受支持


从客户端调用您的应用程序的web服务,然后更新数据库。这不仅是受支持的,实际上是正确的方式。

虽然我同意Remus的许多观点,但我不同意只有一种正确的方式在应用层调用web服务。直接从SQL Server调用服务也有其用途,尽管我承认,在生产环境中这很少是一个好主意。SQLCLR的好处之一是,如果您将代码抽象为可重用的模块化单元,您应该能够轻松地在数据库和应用程序层次结构的其他基于.NET的层之间移动函数,并且相同的地理编码功能可以在客户端应用程序web层中使用,或数据库层,只需要最少的记录量

如果您要去SQLCR路由,那么您可能需要考虑使用其他Bing映射地理编码服务中的一个,特别是其余位置API——因为它通过简单的REST URL访问,将避免SOAP通信从SQLServer到WCF服务的问题。如果您对数据加载进行地理编码,您可能还需要考虑Bing空间数据服务提供的体地理编码能力。


无论采用哪种方式,请记住,例如,调用作为INSERT/UPDATE触发器的一部分插入到表中的地理编码地址信息的web服务在收到响应之前不会完成,并且会暂停该表上的任何进一步更新。比方说,从地理编码服务接收响应需要一秒钟的时间——如果您的地址表中插入了大量记录,您可能很快就会发现服务器崩溃。您可以通过使用Service Broker异步管理对geocode服务的请求,并在返回geooded响应后使用该响应更新表,从而在一定程度上缓解此问题。

好的,在Remus和Alastair的指导下,经过进一步挖掘,我意识到我的做法是错误的,由于我的大部分目标都是简单地对Reporting Services报告中用户给定的单个地址进行地理编码,因此我只需要深入研究如何通过本机TSQL实现这一点。我找到了David Rueter的一篇很棒的文章和示例代码,经过一点修改,我能够生成一个UDF,它不仅使用Bing,还使用Google、Yahoo和Mapquest,并根据响应质量在引擎之间切换以获得最佳答案。对于批处理编码,我正在处理一个存储过程,它将数据加载到临时表中,并执行地理编码,最后更新主表

这个解决方案似乎对我有效,当然我确信CLR是一条可行之路。我还应该考虑其他想法吗


谢谢你到目前为止的帮助

在文档中的哪一处指出sqlservr.exe.config内的配置不受支持?System.Configuration是一个受支持的程序集,那么为什么不支持使用配置呢?@Jonathan:AFAIK文档中没有提到sqlservr.exe.config hack,使用它依赖于未记录的行为。依赖它的应用程序会破坏SQLCLR代码的数据库包含,在故障转移或恢复后将无法工作。文档中没有关于使用SQLCLR可以做的许多事情的内容,这并不意味着它们是黑客或不受支持的。在线书籍没有涵盖2008年的扩展事件是第一个RTM,这并没有使它们不受支持,而且还有很多关于它们的东西仍然只存在于我的博客文章中,就像SQLCLR中的一些东西只存在于非MS博客文章中一样。嗨,你能分享这个UDF/SPROC代码吗?我需要做一些类似的事情,但我有点迷路了。我从来没有用C做过任何事情,也没有做过CLR/UDF/TVF或任何l ike-主要只在SQL中运行查询。干杯