SQL 2008 CLR и Bing Maps - PullRequest
       21

SQL 2008 CLR и Bing Maps

2 голосов
/ 27 мая 2011

Я разработал небольшое приложение на 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 # верна, но я думаю, что что-то упустил в отношении реального веб-сервиса.

Я искал решения повсюду, но не нашел того, который, кажется, работает.

Я использую SQL 2008R2 на сервере 2008R2 с последними исправлениями и версиями .NET.

Любые идеи будут приветствоваться.

Ответы [ 3 ]

3 голосов
/ 27 мая 2011

Выполнение вызовов Web-службы из SQLCLR возможно, но всегда плохая идея. Ресурсы SQL Server чрезвычайно ценны, если их блокируют в ожидании ответов из Интернета. И, в конечном счете, от SQLCLR нет никаких преимуществ, кроме (сомнительного) фактора крутости. Кроме того, загрузка WCF в SQLCLR не поддерживается, см. Политика поддержки для непроверенных сборок .NET Framework в среде SQL Server CLR . И, наконец, сборки SQLCLR не могут видеть никаких разделов конфигурации .config. Существует известный обходной путь размещения конфигурации внутри sqlservr.exe.config, но он также не поддерживается.

Выполните вызовы веб-службы от клиента (вашего приложения), а затем обновите базу данных. Это не только поддерживается, на самом деле это правильный способ.

2 голосов
/ 28 мая 2011

Хотя я согласен со многими пунктами Ремуса, я не согласен с тем, что на уровне приложений существует только один «правильный» способ вызова веб-сервисов.Вызов сервисов непосредственно из SQL Server может иметь свое применение (хотя, я признаю, это редко является хорошей идеей в производственной среде).Одним из преимуществ SQLCLR является то, что, если вы абстрагируете свой код в модульные модули многократного использования, вы сможете легко перемещать функции между базой данных и другими уровнями .NET в иерархии вашего приложения и использовать ту же функцию геокодирования.может использоваться в клиентском приложении, веб-уровне или уровне базы данных с минимальным необходимым объемом записи.

Однако, если вы собираетесь пойти по маршруту SQLCLR, вы можете рассмотреть возможность его использования.других сервисов геокодирования Bing Maps (в частности, API REST Locations - http://msdn.microsoft.com/en-us/library/ff701715.aspx),, который, поскольку к нему осуществляется доступ по простому URL-адресу REST, позволит избежать проблемы связи SOAP от SQL Server к службам WCF. Если вы геокодируетепри загрузке данных вы также можете рассмотреть возможности массового геокодирования, предоставляемые Bing Spatial Data Services - http://msdn.microsoft.com/en-us/library/ff701734.aspx.

В любом случае, имейте в виду, что веб-служба, вызывающая информацию адреса геокодирования, вставлена ​​втаблица как часть триггера INSERT / UPDATEНапример, не завершится, пока не будет получен ответ, и остановит дальнейшие обновления этой таблицы.Скажем, получение ответа от службы геокодирования занимает секунду - если у вас есть какое-то значительное количество записей, вставленных в вашу адресную таблицу, вы можете быстро обнаружить, что ваш сервер поставлен на колени.Эту проблему можно несколько смягчить, используя Service Broker для асинхронного управления запросами к службе геокодирования и обновляя таблицу с помощью геоодированного ответа, как только он будет возвращен.

0 голосов
/ 30 мая 2011

Хорошо, после еще нескольких копаний, руководствуясь Ремусом и Аластером, я понял, что поступаю неправильно, так как большая часть моей цели состояла в том, чтобы просто геокодировать один адрес, указанный пользователем в отчете служб Reporting Services.на самом деле просто нужно глубже вникнуть, как это сделать через нативный TSQL.Я нашел отличную статью и пример кода Дэвида Рютера на SQLServerCentral , и после небольшого изменения я смог создать UDF, который использует не только Bing, но также Google, Yahoo и Mapquest, основываясь на качествеответа будет переключаться между двигателями, чтобы получить лучший ответ.Для пакетного кодирования я работаю над sproc, который загружает данные во временную таблицу, выполняет геокодирование и, в конце концов, обновляет основную таблицу.

Это решение, кажется, работает для меня, конечно, я был уверенCLR был способ пойти.Любые другие идеи, которые я должен рассмотреть?

Спасибо за всю помощь до сих пор!

...