2010-04-18 5 views
2

J'utilise un DataSet typé avec une instruction d'insertion; J'ai une table qui a un champ smalldatetime défini pour accepter des valeurs nulles. Lorsque je l'insère à partir d'un .NET 2.0 FormView, j'obtiens un "débordement SqlDateTime" doit être entre 1/1/1753 12:00:00 AM et 31/12/9999 23:59:59 PM. "débordement SqlDateTime jeté par DataSet typé Insérer

Maintenant, je l'ai lu this post, et le paramètre comme envoyé au constructeur de la classe est définie comme

global::System.Nullable<global::System.DateTime> DoB 

, il semble donc que cela devrait accepter un obj Nullable. De plus, le code généré teste la valeur envoyée.

 if ((DoB.HasValue == true)) { 
      command.Parameters[6].Value = ((System.DateTime)(DoB.Value)); 
     } 
     else { 
      command.Parameters[6].Value = global::System.DBNull.Value; 
     } 

Plus précisément, l'erreur se produit lorsque généré SqlClient.SqlCommand.ExecuteScalar() fonctionne:

 try { 
      returnValue = command.ExecuteScalar(); 
     } 

Donc, je suppose que ma question est: comment puis-je utiliser un DataSet typé pour définir un vide valeur (passé d'un FormView sur CommandName = Insérer) à une valeur nulle dans une base de données?

+0

Suivi supplémentaire: Une partie du problème est que je ne peux pas déboguer ceci. Comme une solution de rechange, j'ai copié l'objet et fait le mien. Puisque les ensembles de données typés créent des classes partielles pour leurs tableadapters, je l'ai tapoté dedans et ai ajouté un double de l'objet d'insertion. Cela m'a permis d'y mettre un point d'arrêt et de voir quelles sont les valeurs. Partie II: Si vous examinez FormViewInsertEventArgs, la date est envoyée comme nulle. Cependant, lorsque vous le comparez à la méthode Insert, vous verrez que cela a changé pour {1/1/0001 12:00:00 AM} ... Plus de travail nécessaire ... –

+0

Ok, il doit y avoir un bug dans la façon dont MS a mis en œuvre leurs routines de réflexion. Si je change le type de paramètre dans ma méthode en chaîne, il est vide. Si j'évalue Nullable nix = ""; Je * * obtiens un null. Il doit y avoir * quelque chose de faux dans l'appel ObjectDataSourceMethod GetResolvedMethodData() car il crée une liste de paramètres avec lesquels appeler la méthode. Quelque part, je pense qu'il fait juste un nouveau DateTime(), pas un nouveau Nullable (). Je n'ai juste plus le temps de le chercher. –

Répondre

1

Ok, alors voici ce qui a fonctionné pour moi. Premièrement, pour réitérer, j'ai un Typed DataSet avec DataAdapters qui génère les objets ADO. Ainsi, sur ma page, je peux créer une ObjectDataSource avec le type qui pointe vers mon adaptateur, puis nommer les différentes méthodes d'accès qui y sont hébergées.

Non, j'ai une insertion dans une table où pratiquement toutes les colonnes sont nullables; certains varchar, un peu de temps.

Lorsque je soumets une forme vide, je voudrais nulls à inscrire. Ils ne sont pas et beaucoup d'erreurs diverses sont jetées. Ce que j'ai fini par faire est de sous-classer ObjectDataSource pour accéder à l'événement Inserting. (sous-classé pour la réutilisabilité) Dans l'événement Inserting, j'ai bouclé les InputParameters, et si c'était une chaîne et == "", je l'ai mis à null. En outre, vous ne pouvez pas définir ConvertNullToDBNull à true; Cela provoque l'échec des chaînes. Cela a permis avec succès à la nullité de rester nulle.

Questions connexes