Bug entre DateTime et SqlDateTime

Le
Gilles TOURREAU
Bonjour,

Je viens de trouver un Bug au niveau du .NET Framework avec les dates
en utilisant l'accès natif SQL Server.

Voici l'exemple de code à tester :

using System;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DateTime now;
SqlParameter p;

now = DateTime.Now;
now = new DateTime(now.Year, now.Month, now.Day, 23, 59,
59, 999);

p = new SqlParameter();
p.DbType = System.Data.DbType.DateTime;
p.Value = now;

Console.WriteLine(" NOW : " + now);
Console.WriteLine(" P.VALUE : " + p.Value);
Console.WriteLine(" P.SQLVALUE : " + p.SqlValue);
}
}
}

Dans cette exemple vous constaterez que "p.SqlValue" possède une valeur
différentes de la valeur "now"

Même en affectant directement SqlValue comme dans cette exemple on
obtient le même problème :

using System;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DateTime now;
SqlParameter p;

now = DateTime.Now;
now = new DateTime(now.Year, now.Month, now.Day, 23, 59,
59, 999);

p = new SqlParameter();
p.DbType = System.Data.DbType.DateTime;
p.SqlValue = new SqlDateTime(now);

Console.WriteLine(" NOW : " + now);
Console.WriteLine(" P.VALUE : " + p.Value);
Console.WriteLine(" P.SQLVALUE : " + p.SqlValue);
}
}
}

La solution de contournement que j'ai trouvé est la suivante :

Il faut utiliser un autre constructeur de SqlDateTime comme ceci :

p.SqlValue = new SqlDateTime(now.Year, now.Month, now.Day, now.Hour,
now.Minute, now.Second, now.Millisecond);

Est-ce que un MVP ou une personne de chez Microsoft puisse me confirmer
que c'est un bug du Framework ?

En vous remerciant par avance

Cordialement

--
Gilles TOURREAU
Responsable informatique
gilles.tourreau@pos.fr

Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Frédéric Queudret \(MS\)
Le #12231211
Bonjour,

La différence de la milliseconde est dûe à la conversion du type
System.DateTime (CLR) vers le type System.Data.SqlTypes.SqlDateTime (SQL).
Si vous souhaitez éviter ce problème de conversion impliquant une précision
amoindrie, vous pouvez utiliser directement le type SqlDateTime.
Votre exemple avec mes modifications:
DateTime now;

SqlParameter p;

now = DateTime.Now;

now = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59, 999);

System.Data.SqlTypes.SqlDateTime conversionSql = new
System.Data.SqlTypes.SqlDateTime(now);

System.Data.SqlTypes.SqlDateTime sqlNow = new
System.Data.SqlTypes.SqlDateTime(now.Year, now.Month, now.Day, 23, 59, 59,
999);

p = new SqlParameter();

p.DbType = System.Data.DbType.DateTime;

p.Value = now;

Console.WriteLine(" NOW : " + now.ToString());

Console.WriteLine(" P.VALUE : " + p.Value.ToString());

Console.WriteLine(" P.SQLVALUE : " + p.SqlValue.ToString());

Console.WriteLine(" P.SQLVALUE Typeof : " +
p.SqlValue.GetType().ToString());

Console.WriteLine(" SQL CONVERSION : " + conversionSql.Value.ToString());

p.Value = sqlNow;

Console.WriteLine(" P.SQLVALUE : " + p.SqlValue.ToString());

Console.WriteLine(" P.SQLVALUE Typeof : " +
p.SqlValue.GetType().ToString());

Console.WriteLine(" SQL NOW : " + sqlNow.Value.ToString());

Vous donnera le résultat suivant:
NOW : 04/08/2006 23:59:59
P.VALUE : 04/08/2006 23:59:59
P.SQLVALUE : 05/08/2006 00:00:00
P.SQLVALUE Typeof : System.Data.SqlTypes.SqlDateTime
SQL CONVERSION : 05/08/2006 00:00:00
P.SQLVALUE : 04/08/2006 23:59:59
P.SQLVALUE Typeof : System.Data.SqlTypes.SqlDateTime
SQL NOW : 04/08/2006 23:59:59

Ce qui résoud le problème.
Cordialement,
Frédéric

"Gilles TOURREAU" news:
Bonjour,

Je viens de trouver un Bug au niveau du .NET Framework avec les dates en
utilisant l'accès natif SQL Server.

Voici l'exemple de code à tester :

using System;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DateTime now;
SqlParameter p;

now = DateTime.Now;
now = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59,
999);

p = new SqlParameter();
p.DbType = System.Data.DbType.DateTime;
p.Value = now;

Console.WriteLine(" NOW : " + now);
Console.WriteLine(" P.VALUE : " + p.Value);
Console.WriteLine(" P.SQLVALUE : " + p.SqlValue);
}
}
}

Dans cette exemple vous constaterez que "p.SqlValue" possède une valeur
différentes de la valeur "now"...

Même en affectant directement SqlValue comme dans cette exemple on obtient
le même problème :

using System;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DateTime now;
SqlParameter p;

now = DateTime.Now;
now = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59,
999);

p = new SqlParameter();
p.DbType = System.Data.DbType.DateTime;
p.SqlValue = new SqlDateTime(now);

Console.WriteLine(" NOW : " + now);
Console.WriteLine(" P.VALUE : " + p.Value);
Console.WriteLine(" P.SQLVALUE : " + p.SqlValue);
}
}
}

La solution de contournement que j'ai trouvé est la suivante :

Il faut utiliser un autre constructeur de SqlDateTime comme ceci :

p.SqlValue = new SqlDateTime(now.Year, now.Month, now.Day, now.Hour,
now.Minute, now.Second, now.Millisecond);

Est-ce que un MVP ou une personne de chez Microsoft puisse me confirmer
que c'est un bug du Framework ?

En vous remerciant par avance...

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr




Patrice
Le #12225861
C'est pas vraiment un bug. Le problème est que la précision des dates dans
une base n'est pas forcément la même que celle utilisée côté client ce qui
peut donc générer des arrondis (3,33 ms de précision pour les datetime
SQLServer).

J'ai déjà vu par exemple du temps d'ADO des pbs de verrouillage optimiste
causé par ce problème...



--
Patrice

"Gilles TOURREAU"
Bonjour,

Je viens de trouver un Bug au niveau du .NET Framework avec les dates en
utilisant l'accès natif SQL Server.

Voici l'exemple de code à tester :

using System;
using System.Data.SqlClient;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DateTime now;
SqlParameter p;

now = DateTime.Now;
now = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59,
999);

p = new SqlParameter();
p.DbType = System.Data.DbType.DateTime;
p.Value = now;

Console.WriteLine(" NOW : " + now);
Console.WriteLine(" P.VALUE : " + p.Value);
Console.WriteLine(" P.SQLVALUE : " + p.SqlValue);
}
}
}

Dans cette exemple vous constaterez que "p.SqlValue" possède une valeur
différentes de la valeur "now"...

Même en affectant directement SqlValue comme dans cette exemple on obtient
le même problème :

using System;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DateTime now;
SqlParameter p;

now = DateTime.Now;
now = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59,
999);

p = new SqlParameter();
p.DbType = System.Data.DbType.DateTime;
p.SqlValue = new SqlDateTime(now);

Console.WriteLine(" NOW : " + now);
Console.WriteLine(" P.VALUE : " + p.Value);
Console.WriteLine(" P.SQLVALUE : " + p.SqlValue);
}
}
}

La solution de contournement que j'ai trouvé est la suivante :

Il faut utiliser un autre constructeur de SqlDateTime comme ceci :

p.SqlValue = new SqlDateTime(now.Year, now.Month, now.Day, now.Hour,
now.Minute, now.Second, now.Millisecond);

Est-ce que un MVP ou une personne de chez Microsoft puisse me confirmer
que c'est un bug du Framework ?

En vous remerciant par avance...

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr




Poster une réponse
Anonyme