Nous utilisons SQL Server Standard Edition 8.00.760 (SP3) sur une plate-forme Small Business Server 2003. Alors que traquer un System.Data.DBConcurrencyException pour un DataSet inexplicable fortement typées, j'ai découvert le problème suivant:SQL Server 2000 distingue 0,00 décimal zéro et 0,00 alors que ADO.NET ne pas
est donné ce tableau:
CREATE TABLE [dbo].[Auszahlung](
[auszahlungid] [int] IDENTITY(1,1) NOT NULL,
[spesenkonto] [decimal](10, 2) NOT NULL,
Et cette requête pour une ligne initialement insérée avec des décimales calculées dans .NET 2.0 en utilisant un DataSet fortement typées:
SELECT [auszahlungid], [spesenkonto]
FROM [Auszahlung]
WHERE [auszahlungid] = 35
Lorsqu'il est exécuté sur un client SQL Server Management studio 2005, je reçois ce résultat:
auszahlungid spesenkonto
------------ ---------------------------------------
35 0.00
(1 Zeile(n) betroffen)
Mais lorsqu'il est exécuté sur l'Analyseur de requêtes sur le Sql Server 2000, je reçois ce zéro négatif:
auszahlungid spesenkonto
------------ ------------
35 -.00
(1 row(s) affected)
Par conséquent, les requêtes
SELECT [auszahlungid], [spesenkonto]
FROM [Auszahlung]
WHERE [auszahlungid] = 35
AND [spesenkonto] = 0.00
et (inconsequently sur SQL 2000 Interrogation Analyseur)
SELECT [auszahlungid], [spesenkonto]
FROM [Auszahlung]
WHERE [auszahlungid] = 35
and spesenkonto = -.00
à la fois produire 0 lignes, et toute mise à jour de ligne en utilisant un DataSet fortement typé .NET déclenchera une exception System.Data.DBConcurrencyException en raison de la restriction de concurrence d'accès optimiste.
Questions:
Est-ce un bug connu dans MSSQL?
Comment rendre mon système fiable sans sacrifier la concurrence optimiste?
Que Sélectionnez [auszahlungid], CAST ([spesenkonto] nvarchar (16)) FROM [Auszahlung] O WH [auszahlungid] = 35; revenir? – RBarryYoung
'CAST ([spesenkonto] as nvarchar (16))' est une bonne idée, car elle me permet de repérer la colonne décimale corrompue en utilisant SQL Server Management Studio 2005 sans mstsc. Selon http://en.wikipedia.org/wiki/-0_(number) zéro négatif est défini dans IEEE 754 pour les nombres à virgule flottante, et il "zéro négatif et zéro positif comparer égal sous comparaison (numérique) par défaut" (contrairement à SQL Server 2000). Microsoft confirme un problème similaire pour les décimales comme BUG #: 16672 (SQLBUG_65) pour l'ancienne version de SQL Server 6.5 Standard Edition: http://support.microsoft.com/kb/189390/en-us –
Cela a du sens. Mon instinct était que c'était une corruption de données dans votre DB ou un bug. (Je n'ai pas été capable de le reproduire). – RBarryYoung