Двойное значение изменилось после передачи через.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, а затем увеличивает его - возможно, чтобы указать, что это новая версия строки, потому что вы ее изменили.

Другие вопросы по тегам