2011-05-27 78 views
2

我開發了一個小型C#應用程序,使我可以使用配置爲服務引用的Bing地理編碼服務對地址表進行地理編碼。我有裝配加載,但是當我嘗試通過存儲過程來調用它,我收到以下錯誤:SQL 2008 CLR和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版本在Server 2008R2上運行SQL 2008R2。

任何想法將是最受歡迎的。

回答

0

好了,在Remus和Alastair指導下進行了一些更深入的挖掘之後,我意識到自己的方式是錯誤的,因爲我的大部分目標都是在報告服務報告中簡單地對用戶提供的單個地址進行地理編碼我真的需要深入挖掘如何通過本地TSQL來完成。我發現了David Rueter在SQLServerCentral上的一篇很棒的文章和示例代碼,經過一些修改後,我能夠生成一個UDF,它不僅使用Bing,還使用Google,Yahoo和Mapquest,並且基於響應的質量將在引擎獲得最佳答案。對於批量編碼,我正在處理將數據加載到臨時表並執行地理編碼並在最後更新主表的sproc。

這個解決方案似乎對我很有用,當然我確定CLR是最好的選擇。我應該考慮的任何其他想法?

感謝所有幫助!

3

從SQLCLR做Web服務調用是可能的,但總是一個壞主意。 SQL Server資源對於阻止等待來自Internet的響應非常寶貴。最終,從SQLCLR開始實現它的優勢是零,而不是(可疑的)酷炫因素。另外,不支持將WCF加載到SQLCLR中,請參閱Support policy for untested .NET Framework assemblies in the SQL Server CLR-hosted environment。最後,SQLCLR程序集不能看到任何.config配置節。通過將配置放置在sqlservr.exe.config中有一個知道的解決方法,但也不受支持。

從客戶端(您的應用程序)執行Web服務調用,然後更新數據庫。這不僅支持,實際上是正確的方式。

+0

在文檔中它說在sqlservr.exe.config裏面的配置是不受支持的? System.Configuration是一個受支持的程序集,所以不支持使用配置的是什麼? – 2011-05-28 00:40:03

+0

@Jonathan:AFAIK在文檔中沒有提到'sqlservr.exe.config'破解並且使用它依賴於無證行爲。依靠它的應用程序會中斷SQLCLR的數據庫遏制(代碼在故障切換後或恢復後將不起作用)。 – 2011-05-28 00:52:16

+0

文檔中沒有關於您可以使用SQLCLR做的許多事情,並不意味着它們是黑客或不受支持的。網上的書沒有包括2008年的擴展事件是第一次RTM,這並沒有使他們不受支持,並且有很多關於它們的東西,但仍然只在我的博客文章中,就像SQLCLR中的東西是隻在非MS博客文章中。 – 2011-05-28 03:50:48

2

雖然我同意Remus的許多觀點,但我不同意在調用Web服務的唯一「正確」方式是在應用程序層。直接從SQL Server調用服務可以使用它(儘管,我承認,這在生產環境中很少是個好主意)。 SQLCLR的好處之一是,如果將代碼抽象爲可重用的模塊化單元,則應該能夠輕鬆地在數據庫和應用程序層次結構的其他基於.NET的層之間移動功能,並且可以使用相同的地理編碼功能可以在客戶端應用程序,Web層或數據庫層中使用,只需要最少量的記錄。

但是,如果您打算繼續使用SQLCLR路線,則可能需要考慮使用其他Bing地理位置地理編碼服務(特別是REST位置API - http://msdn.microsoft.com/en-us/library/ff701715.aspx),因爲它是通過簡單REST URL將避免從SQL Server到WCF服務的SOAP通信問題。如果您要對大量數據進行地理編碼,則可能還需要考慮Bing Spatial Data Services提供的批量地理編碼功能 - http://msdn.microsoft.com/en-us/library/ff701734.aspx。請注意,例如,作爲INSERT/UPDATE觸發器的一部分插入到表中的地址解析地址信息調用的Web服務在接收到響應之前將不會完成,並且會進一步停止該表格中的更新。假設接收地理編碼服務的響應需要一秒鐘的時間 - 如果您的地址表中插入了大量記錄,則可能很快就會發現您的服務器正在被癱瘓。通過使用Service Broker異步管理對地理編碼服務的請求,並使用返回的地理編碼響應更新表,您可以稍微緩解此問題。