SQL Server 2000区分十进制零0.00和-.00,而ADO.NET没有

时间:2009-07-27 13:11:06

标签: sql-server

我们在Small Business Server 2003平台上使用SQL Server Standard Edition 8.00.760(SP3)。 在追踪强类型数据集的无法解释的System.Data.DBConcurrencyException时,我发现了以下问题:

鉴于此表:

CREATE TABLE [dbo].[Auszahlung](
    [auszahlungid] [int] IDENTITY(1,1) NOT NULL,
    [spesenkonto] [decimal](10, 2) NOT NULL,

此查询最初使用强类型数据集在.NET 2.0中计算的带小数的行:

SELECT [auszahlungid], [spesenkonto]
FROM [Auszahlung] 
WHERE [auszahlungid] = 35

在Sql Server Management Studio 2005客户端上运行时,我得到以下结果:

auszahlungid spesenkonto
------------ ---------------------------------------
35           0.00

(1 Zeile(n) betroffen)

但是当在Sql Server 2000上的查询分析器上运行时,我得到这个负零:

auszahlungid spesenkonto  
------------ ------------ 
35           -.00

(1 row(s) affected)

因此,查询

SELECT [auszahlungid], [spesenkonto] 
FROM [Auszahlung] 
WHERE [auszahlungid] = 35
AND [spesenkonto] = 0.00

和(随后在SQL 2000查询分析器上)

SELECT [auszahlungid], [spesenkonto]
FROM [Auszahlung] 
WHERE [auszahlungid] = 35
and spesenkonto = -.00

产生0行,并且使用.NET Strongly Typed DataSet的任何行更新都会引发System.Data.DBConcurrencyException,因为乐观并发限制。

问题:

这是MSSQL中的已知错误吗?

如何在不牺牲乐观并发的情况下让我们的系统再次可靠?

1 个答案:

答案 0 :(得分:0)

也许,当使用SQL2000驱动程序时,将numeric解释为float ... 您可以尝试以下解决方法

SELECT [auszahlungid], [spesenkonto] 
FROM [Auszahlung] 
WHERE [auszahlungid] = 35
AND ABS([spesenkonto]) < 0.01