Глядя на код в этом блоге, если вы передаете NULL
, значит, ошибку выдает не API. Ошибка возникает из-за того, что NULL
значения не обрабатываются при первом вызове метода. Код просто преобразует входные параметры SqlString
в string
без предварительной проверки, есть ли значение в переменной SqlString
. SqlString
очень похож на обнуляемый string
.
К счастью, довольно легко настроить код для правильной обработки значений NULL
во входных параметрах. Начиная с отредактированного фрагмента исходного кода ниже, я покажу, как это сделать для одного параметра, и вы можете повторить эту модификацию для других (ну, те, которые на самом деле могут быть 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
.
Это должно работать, пока Bing Maps API работает с пустым значением для adminDistrict
(т.е. ...&adminDistrict=&locality=...
) , в отличие от adminDistrict
, отсутствующего в запросе GET (что достаточно просто, просто требуется дополнительная модификация).
ТАКЖЕ: Пока вы собираетесь при обновлении кода вам действительно следует переместить вызовы методов Close()
и Dispose()
в finally
блок для этого try
/ catch
.
Для получения дополнительной информации о работе с SQLCLR в целом посетите: Информация о SQLCLR