Двойное значение изменилось после передачи через.NET remoting
У меня есть приложение, которое использует наборы данных ADO.NET и адаптеры данных в сочетании с удаленным взаимодействием (архитектура клиент / сервер, передача наборов данных посредством удаленного взаимодействия).
Теперь я сталкиваюсь со следующей проблемой:
TL; DR: двойное значение 44.850000925362000
превращается в 44.850000925362004
после отправки набора данных через удаленное взаимодействие на сервер.
Я создаю новую строку в базе данных, сохраняя набор данных, который содержит столбец с плавающей запятой (сопоставленный с удвоенным значением в наборе данных). Двойное значение сохраняется 44.850000925362
Затем я прочитал эту строку из базы данных (DataAdapter.Fill
) и получить то же значение (проверено с помощью BitConverter.DoubleToInt64
). Этот набор данных проходит через удаленное взаимодействие с клиентом и затем объединяется в набор данных варианта использования на клиенте. Все еще сохраняя то же значение.
Этот набор данных затем объединяется с набором данных usecase, строка из которого импортируется в другую таблицу (потому что считывается из представления, сохраняется в таблицу), и значение изменяется перед передачей набора данных usecase (теперь содержащего строку в другой стол).
На стороне клиента значение остается тем же - но как только набор данных достигает сервера, рассматриваемое значение отличается (хотя в этот конкретный столбец не было внесено никаких изменений - оно все еще остается неизменным). Unchanged
и даже оригинальное значение отличается).
Пример: Сохранить 44.850000925362000
Читать 44.850000925362000
Объединить, импортировать, изменить строку - еще 44.850000925362000
Отправить на сервер для сохранения, есть 44.850000925362004
на сервере!
... который затем вызывает ConcurrencyException
потому что запись сохраняется с 44.850000925362000
- но обновление адаптера данных использует 44.850000925362004
в WHERE
состояние (оптимистичный параллелизм).
Никто другой не трогал этот ряд между ними.
Обновить
Я попытался настроить тестовый сервер, и там все отлично работает. Самое смешное: одна и та же сборка отлично работает, если я использую ее в другом сервисе. Я не могу найти ничего в конфигурации или запуске, который объяснил бы это. Я использую двоичный форматер на обоих, оба.NET 4.0, оба используют один и тот же исходный код... но один ведет себя иначе, чем другой.
Дальнейшее обновление
Я даже захватил оператор SQL, который выполнялся для обновления. Если я запускаю параметры как WHERE
пункт в SELECT
Заявление, он выбирает правильную запись. Поэтому, когда я делаю это вручную (через SQL Management Studio), он принимает небольшую дельту между значением в строке и значением, которое я даю для условия. Тем не менее, он не работает вообще при запуске обновления через адаптер.
Во всяком случае, я сдался. Я прибегнул к округлению до 5 цифр - намного больше точности, чем мне нужно в этом случае. Может привести к странным результатам, если число станет большим, но я не ожидаю, что в этом случае использования (мы говорим о весе в килограммах).
1 ответ
Я могу рассказать вам, что здесь происходит. Я не уверен почему, хотя:
Если вы интерпретируете биты 44.850000925362000
а также 44.8500009253620004
как Int64 вы получите значения 4631508893792468976
а также 4631508893792468977
,
Как видите, второе значение - это первое, увеличенное на единицу.
Итак, похоже, что кто-то где-то интерпретирует это двойное значение как Int64, а затем увеличивает его - возможно, чтобы указать, что это новая версия строки, потому что вы ее изменили.