2009-07-27 4 views
1

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?

+0

Que Sélectionnez [auszahlungid], CAST ([spesenkonto] nvarchar (16)) FROM [Auszahlung] O WH [auszahlungid] = 35; revenir? – RBarryYoung

+0

'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 –

+0

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

Répondre

0

Peut-être, lorsque l'on travaille avec chauffeur SQL2000 interprète numérique comme flotteur ... vous pouvez essayer la solution suivante

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

Bien sûr, 'AND ABS ([spesenkonto]) <0.01' fonctionne, mais je ne vais pas corriger manuellement le code généré par VisualStudio 2005 dans le DataSet Strongly Typed pour gérer la concurrence optimiste. C'est le cœur du problème: Le code généré par le framework semble (dans des cas rares) produire des données qui ne peuvent pas être traitées par ce même code. –

+0

Pour une simultanéité optimiste, nous avons généralement un seul champ qui porte généralement le même nom ModificationDate et qui est assigné à DateTime.Now dans .NET pour tous les enregistrements mis à jour.Nous modifions les conditions pour que la concurrence soit WHERE [clé primaire] = @original_key ET ModificationDate = @original_ModificationDate et exclut tous les autres champs des conditions de concurrence. Je n'aime pas les idées d'avoir des quesries autogénérées avec 20 ou 30 champs dans la condition WHERE. –

Questions connexes