2010-04-08 5 views
1

Je convertis un projet pour utiliser ObjectDataSources au lieu de SqlDataSources. J'utilise des zones de texte pour la saisie des dates par l'utilisateur. Lorsque ceux-ci étaient vides avec un SqlDataSource, la valeur envoyée à la procédure stockée était nulle, ce qui me permet d'obtenir les bons résultats d'une requête sans date spécifiée. Avec l'ObjectDataSource, une entrée vide dans les zones de texte date est convertie en 01/01/0001 00:00:00, ce qui n'est pas acceptable pour la requête. Quelqu'un sait comment je peux recevoir une valeur nulle pour ce paramètre sur mon objet ObjectDataSource lorsque la zone de texte est vide?ObjectDataSource convertit la chaîne vide en 01/01/01

thanksHi

+0

Utilisez-vous un DateTime nullable dans votre classe? –

Répondre

0

J'ai trouvé une façon de le faire, en vérifiant en ligne MinDate et les remplacer par null. Se sent un peu hacky, mais ça marche bien, et je ne trouve pas d'autres suggestions. Si vous avez une meilleure idée, s'il vous plaît faites le moi savoir!

cmd.Parameters.AddWithValue("@ABCId", objectType == "AbcId" ? objectId.ToString() : null); 
      cmd.Parameters.AddWithValue("@CounterpartyId", objectType == "CounterpartyId" ? objectId.ToString() : null); 
      cmd.Parameters.AddWithValue("@FromDate", fromDate == DateTime.MinValue ? null : fromDate.ToLongDateString()); 
      cmd.Parameters.AddWithValue("@ToDate", toDate == DateTime.MinValue ? null : toDate.ToLongDateString()); 
      cmd.Parameters.AddWithValue("@RelationshipId", objectType == "RelId" ? objectId.ToString() : null); 
      cmd.Parameters.AddWithValue("@ShowNonTradePayments", showNonTradePayments); 
      cmd.Parameters.AddWithValue("@ShowTradePayments", showTradePayments); 
+0

Vous dites "quand ceux-ci étaient vides ... la valeur envoyée à la procédure stockée était nulle ...", êtes-vous sûr qu'il n'a pas été envoyé comme DateTime.MinValue, comme vous avez dû gérer spécifiquement cela dans votre réponse- code? Si toDate n'est pas nullable, il ne peut jamais être nul. –

+0

Je voulais dire qu'à l'origine, quand cela a été fait en utilisant un SqlDataSource, alors les zones de texte de date, lorsqu'elles sont laissées vides, se traduiraient par des valeurs NULL atteignant le proc stocké. Mon proc stocké inclurait alors tous les résultats indépendamment de la date. Lorsque j'ai essayé de faire la même chose avec l'ODS, les valeurs MinDate étaient transmises à la proc stockée, ce qui entraînait des erreurs ou des résultats incorrects. J'ai donc dû trouver un moyen de convertir les valeurs MinDate entrantes en valeurs nulles afin que le proc stocké se comporte correctement - c'est ce que fait le code ci-dessus. – willemaster

0

J'ai fini par avoir "01/01/1900" comme "null". Pas la solution du livre, mais en réalité cela ne nous dérange pas. Nous avons notre propre classe pour les conversions, et il capture ces valeurs sentinelles de manière transparente, de sorte que nous pouvons oublier ce problème pour la plupart des choses. Dans les requêtes HQL/SQL, au lieu de demander des valeurs non nulles, nous demandons simplement des valeurs supérieures au 01/01/1901 (non nul) ou des valeurs inférieures au 01/01/1901 (null).

+0

Oui, je peux voir que cela fonctionnerait, mais je suis surpris que MS n'ait pas fourni une solution plus élégante, surtout quand cette solution de contournement n'est pas nécessaire avec un SqlDataSource. – willemaster