1 votes

Désaccord sur le format des données dans le serveur sql et le code C#

J'ai un problème.

J'ai une application en C# avec SQL SERVER 2005 comme backend.

Le problème est d'extraire le bon enregistrement en fonction de la date.

Le code frontal est

if (string.IsNullOrEmpty(txtFromDate.Text)) 
    SelectCmd.Parameters[0].Value = DBNull.Value;
else 
    SelectCmd.Parameters[0].Value = txtFromDate.Text;

Maintenant, si je lance usp_NewGetUserDetail '03/04/2010' dans l'analyseur de requêtes, je suis capable d'obtenir l'enregistrement correct.

Je suis donc très confiant que mon SP est correct (j'ai testé avec de nombreuses variations).

Mais si la même valeur est passée depuis le code frontal (SelectCmd.Parameters[0].Value = "03/04/2010";) je reçois des enregistrements inattendus. Je veux dire par là, les enregistrements qui ne sont pas dans la plage de dates.

Je suppose qu'il y a un décalage entre le format de date du backend et du frontend.

Veuillez me faire savoir si j'ai oublié des informations que je dois fournir pour résoudre ce problème.

Aidez-moi, s'il vous plaît.

2voto

marc_s Points 321990

La gestion des dates sur le serveur SQL est une affaire délicate, car la plupart des formats dépendent de la langue et de la région. Comme Adam l'a déjà mentionné, il est préférable d'éviter de traiter les dates sous forme de chaînes de caractères, car cela peut s'avérer compliqué. DateTime (tant en .NET qu'en T-SQL) est beaucoup plus sûre et plus facile.

Mais si vous devez utiliser des chaînes de caractères, tenez compte des points suivants : une date comme 02/05/2010 sera interprétée comme le 5 février 2010 à certains endroits, ou comme le 2 mai 2010 à d'autres. Donc, quoi que vous fassiez, vous rencontrerez toujours quelqu'un qui a un réglage différent et qui obtient des résultats différents.

La façon de procéder est d'utiliser l'option Format ISO-8601 qui est indépendant de tous les paramètres régionaux et linguistiques et qui fonctionne toujours.

Donc pour vos rendez-vous, toujours utilisez le format AAAAMMJD - tout d'abord, il fonctionne toujours, et ensuite, avec ce format, vous obtenez un comportement de tri "naturel" - trié par année, puis mois, puis jour.

0voto

Adam Robinson Points 88472

Il n'est pas nécessaire de passer la date comme une chaîne de caractères, ni debe vous. Définissez la valeur des paramètres à un DateTime qui représente la date que vous souhaitez, et non sa représentation sous forme de chaîne.

0voto

Austin Salonen Points 28057

Essayez quelque chose comme ça :

DateTime fromDate;
if (DateTime.TryParse(txtFromDate.Text, out fromDate))
{
    SelectCmd.Parameters[0].Value = fromDate
}
else
{
    SelectCmd.Parameters[0].Value = DBNull.Value;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X