通过.NET远程传输后,双值发生了变化

时间:2015-04-29 15:42:58

标签: .net ado.net .net-remoting

我有一个应用程序,它将ADO.NET数据集和数据适配器与远程处理结合使用(客户端/服务器架构,通过远程处理传输数据集)。

我现在面临以下问题:

TL; DR:通过远程处理将数据集发送到服务器后,双值44.850000925362000变为44.850000925362004

我通过保存数据集在数据库中创建一个新行,该数据集包含一个浮点列(在数据集中映射为double)。保存的双倍值为44.850000925362

然后,我从数据库(DataAdapter.Fill)中读取此行并获取相同的值(使用BitConverter.DoubleToInt64进行检查)。此数据集通过远程处理传递到客户端,然后合并到客户端上的用例数据集中。仍然保持相同的价值。

然后将此数据集合并到一个usecase-dataset中,将该行导入另一个表(因为从视图中读取,保存到表中),并在传输usecase-dataset之前更改一个值(现在包含一个在另一个表中的行)。

在客户端,值仍然相同 - 但是一旦数据集到达服务器,有问题的值就会不同(尽管没有对该特定列进行任何更改 - 它仍然是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 个答案:

答案 0 :(得分:0)

我可以告诉你这里发生了什么。不过我不知道为什么:

如果您将44.85000092536200044.8500009253620004的位解释为Int64,您将获得46315088937924689764631508893792468977的值。

如您所见,第二个值是第一个增加1的值。

所以,它看起来像某人,某处将该值解释为Int64然后递增它 - 可能表示这是该行的新版本,因为您修改了它。