BizTalk 2013 WCF-SQL адаптер для вставки в десятичном виде (38,20)
У меня возникают проблемы при вставке значений в столбцы SQL Server типа decimal(38, 20) из BizTalk 2013 с использованием адаптера WCF-SQL. Я получаю InvalidCastException с сообщением: "System.InvalidCastException: указанное приведение недействительно"
Если я тестирую десятичный тип столбца (18,18), он работает.
Похоже, что адаптер WCF-SQL не обрабатывает десятичную с очень высокой точностью. Вопрос в чем ограничение? И есть ли обходной путь?
Когда я генерирую XSD из информации таблицы базы данных, десятичное число (38,20) превращается в xs: строку с ограничением длины 40. Возможно, это признак того, что адаптер WCF-SQL не может обрабатывать такую точность...? Я также проверил, чтобы изменить XSD на xs: десятичное, но без разницы.
Кто-нибудь?
ДОПОЛНЕНИЕ: не нашел "хорошего" способа справиться с этим ограничением.
Окончательная настройка: XML => WCF-SQL адаптер => Хранимая процедура с параметром типа таблицы, содержащим столбцы varchar(40) => Столбцы переменной таблицы CAST в десятичные (38,20) по одному => INSERT в таблицу назначения.
Таким образом, решение состояло в том, чтобы изменить тип таблицы так, чтобы она принимала varchar, и вручную конвертировать в хранимую процедуру.
Был бы рад, если бы кто-то мог объяснить лучшее решение!
1 ответ
Десятичная точность ограничена типом платформы.NET. Смотрите здесь.
Также описано в документации BizTalk здесь. Msgstr "Десятичная, если точность <= 28. Строка, если точность> 28".
Таким образом, ваш способ работы со строками - вариант. Использовать Round
functoid в вашей карте к схеме SQL, если вам не нужно больше 29 позиций.
Другой вариант, который вы могли бы рассмотреть, - это изменить региональные настройки для пользователя хоста BizTalk, использующего порт отправки. Текущий параметр / язык вашего десятичного разделителя представляет собой запятую вместо точки (или наоборот) и не соответствует типу данных для SQL Server. Для этой опции вы должны сохранить тип как string
в вашей схеме и держите его десятичным в вашей таблице SQL Server.