Стартовая страница › Форумы › Ошибки в работе › Экспорт в БД — ("@val"): … is not a valid instance of data type
- В этой теме 10 ответов, 2 участника, последнее обновление 6 лет, 5 месяцев назад сделано Mikhail.
-
АвторСообщения
-
04.08.2017 в 06:31 #6903baurУчастник
Добрый день,
вчера у меня остановился запись в БД с ошибкой:
2017-08-04 08:40:30 Ошибка при экспорте текущих данных в БД MSSQL — xx.xx.xx.xx: The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 5 («@val»): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.Смотрю через текущий срез, там значение канала «не число», это понятно, но по цепочке остановился запись и в остальные базы. Везде пишут эту же ошибку, хотя этот канал им уже не относится. Там даже явный фильтр:
if (@cnlNum = 2361) insert into ....
но все ровно пишет ошибку.
еще вопрос: как можно фильтровать, чтобы каналы со значением «не число» не попали в туда?
04.08.2017 в 08:45 #6904baurУчастникошибка никак не устраняется пока не отключаю (галочка не активный) канал, который выдает ошибку («не число»).
Может в будущем поставить галочку «запись в БД» рядом с каналом прямо в Администраторе, чтобы не все каналы вломилась в скрипт по записи в БД или фильтровать каналы, которые выдает «не число» и тем самым сломает скрипт.
- Этот ответ был изменен 6 лет, 7 месяцев назад от baur.
04.08.2017 в 21:18 #6916MikhailМодераторЕсли нужно быстро решить проблему, то в формуле входного канала укажите double.IsNaN(Cnl) ? 0 : Cnl
Если для канала уже есть какая-то формула, то такую проверку можно сделать в ней.Какой драйвер Коммуникатора работает с этим каналом, то есть какой драйвер создает эти «не числа»?
Может в будущем поставить галочку «запись в БД» рядом с каналом прямо в Администраторе
Лучше сохранять базу лёгкой и понятной, насколько это возможно, а специфические настройки делать в модулях.
05.08.2017 в 08:52 #6921baurУчастникdouble.IsNaN(Cnl) ? 0 : Cnl
да, как раз я получаю значение NAN, это ModbusRTU
спасибо, проверю …07.08.2017 в 12:02 #6940MikhailМодераторПомню, что тоже сталкивался с подобной ситуацией, и было принято решение не избавляться от NaN на уровне драйвера, чтобы было понятно, что же на самом деле нам передаёт устройство. А на уровне формул проблема решается легко.
08.08.2017 в 15:30 #6966baurУчастникА на уровне формул проблема решается легко.
но, потенциально каждый канал может выдать NaN, как тут быть?
и почему фильтр
if (@cnlNum = 2361) insert into ....
не сработал?
09.08.2017 в 10:50 #6973MikhailМодераторNaN может быть только в том случае, если его передаёт конкретное устройство по Модбас. Не все устройства передают NaN, зависит от того, как реализовал прошивку производитель.
Полагаю, синтаксис фильтра не корректный, т.к. запрос не является блоком T/SQL. Лучше используйте вызов хранимых процедур из модуля экспорта, а них уже реализуйте нужную логику.
09.08.2017 в 12:32 #6979baurУчастникПолагаю, синтаксис фильтра не корректный, т.к. запрос не является блоком
фильтр работает, по крайней мере в БД записывает только те каналы.
Лучше используйте вызов хранимых процедур из модуля экспорта, а них уже реализуйте нужную логику.
Да, насчет хранимой процедуры я уже подумал об этом, передать val как varchar дальше уже конвертировать
10.08.2017 в 09:27 #6982MikhailМодераторС хранимыми процедурами получается понятнее. Кроме того, в них можно писать логи и т.п.
02.10.2017 в 07:43 #7426baurУчастник5.1.0.1 (25.09.2017)
— Исправлена ошибка получения нулевых значений входных каналов при расчётахкасается ли это к обсужденной теме?
02.10.2017 в 12:55 #7439MikhailМодераторЭто другая ошибка при использовании функции Val в формулах.
Если будем с Вами дорабатывать модуль по Вашему ТЗ, то заодно устраним проблему из этой темы, либо программно, либо на уровне SQL.
Вы не пробовали хранимые процедуры? -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.