2013-03-12 9 views
3

Quelqu'un peut-il me dire pourquoi je reçois une exception StrongTypingException lors de l'affectation d'une valeur à une colonne dans un DataTable fortement typé? (Je comprends pourquoi je l'obtiens si je devais lire la colonne avec la valeur DBNull)StrongTypingException lors de la définition de la valeur de colonne

Dans l'exemple ci-dessous, j'essaie d'attribuer une valeur d'un DataTable à un autre (toutes les colonnes de l'exemple sont de type Int32). Je peux assigner une valeur à la colonne 'newOrderRow.items' mais quand je fais la même chose avec la colonne 'newOrderRow.debcode' une exception est levée! Pourquoi?!

Certaines des choses que j'ai essayé jusqu'à présent (sans chance):
- Assignez valeur codée en dur au lieu de « calclineRow.debcode »
- Appel newOrderRow.SetdebcodeNull() avant d'attribuer une autre valeur
- Modification de la propriété DefaultValue sur la colonne 'debcode' dans la table 'orderrows' de DBNull à -1 et il STILL jette encore l'exception et dit que c'est DBNull !!!

myDataSet.orderrowsRow newOrderRow; 

foreach (MyDataSet.calclinesRow calclineRow in myDataSet.calclines) 
{ 
    newOrderRow = myDataSet.orderrows.NeworderrowsRow(); //Create new 'orderrows' row 

    //Assign values from one DataTable to another 
    if (!calclineRow.IsitemsNull()) 
     newOrderRow.items = calclineRow.items; //calclineRow.items == 1. Assignment successful 
    if (!calclineRow.IsdebcodeNull()) 
     newOrderRow.debcode = calclineRow.debcode; //calclineRow.debcode == 556. Assignment raises System.Data.StrongTypingException ! (See message below) 


    myDataSet.orderrows.AddorderrowsRow(newOrderRow); 
} 

/*Exception Message: 
===================== 

System.Data.StrongTypingException: The value for column 'debcode' in table 'orderrows' is DBNull. 
---> System.InvalidCastException: Specified cast is not valid. 
at MyProject.MyDataSet.orderrowsRow.get_debcode() in Q:\MyProjFolder\DataSets\MyDataSet.Designer.cs:line 21680 
*/ 

Répondre

0

RÉSOLU. Désolé mon mauvais. J'ai oublié que je faisais des choses avec la colonne 'debcode' dans le gestionnaire d'événement OnColumnChanging sur mon DataTable. Quand j'ai désactivé cela, tout a fonctionné comme il se doit.

Merci quand même!

4

Vous devez utiliser les méthodes générées automatiquement SetNull si la propriété annulable est nulle:

if (!calclineRow.IsitemsNull()) 
    newOrderRow.items = calclineRow.items; 
else 
    newOrderRow.SetitemsNull(); 

if (!calclineRow.IsdebcodeNull()) 
    newOrderRow.debcode = calclineRow.debcode; 
else 
    newOrderRow.SetdebcodeNull(); 

Vous avez aussi annonce la nouvelle DataRow à la table dans la boucle depuis NeworderrowsRow Est-ce pas automatiquement.

myDataSet.orderrows.AddNeworderrowsRow(newOrderRow); 

la ligne où l'exception se produit (MyDataSet.Designer.cs: ligne 21680) suggère qu'il est soulevé à partir d'un procédé auto-généré du DataSet qui lit cette propriété. Puisque vous n'avez pas utilisé SetdebcodeNull, il ne sait pas qu'il est nul et lance le StrongTypingException lorsqu'il essaie de le lire.

+0

Non, ce n'est pas où mon problème est. Le problème est que 'calclineRow.debcode' n'est PAS DBNull. Il a une valeur de 556 mais quand j'essaye d'assigner cette valeur à 'newOrderRow.debcode' le programme se plaint de 'newOrderRow.debcode' est DBNull. (Ce qui bien sûr, c'est pourquoi j'essaie de lui assigner une valeur! Stupid .NET!) – Kberg

+0

Pourquoi remplacez-vous toujours 'newOrderRow' dans la boucle? Au lieu de "réutiliser" une variable externe, créez-la dans la boucle. 'orderrows newOrderRow = myDataSet.orderrows.NeworderrowsRow();' Je ne suis pas sûr si cela cause le problème. Et vous devez ajouter une nouvelle ligne à 'DataTable' car' NeworderrowsRow' ne le fait pas implicitement. –

+0

Je ne suis pas sûr de comprendre ce que vous voulez dire. Ajouté un peu plus du code pour clarifier.Quoi qu'il en soit, cela n'a pas grand chose à voir avec le problème que nous discutons ici. – Kberg

0

Vous pouvez essayer ceci:

if (!calclineRow.IsdebcodeNull()) 
    newOrderRow["debcode"] = calclineRow.debcode; 

Bien que je l'avoue ne fait pas beaucoup de sens, il apparaît comme si vous appelez le Set pour newOrderRow.debcode a pour effet d'appeler la Get, qui, comme note renvoie une exception si la propriété sous-jacente est DbNull.

+0

Essayé, n'a pas fonctionné. – Kberg

+0

Vous devriez probablement examiner le code généré pour votre ensemble de données. Je me demande s'il se passe quelque chose de bizarre. –

+0

Oui, je le pense aussi. J'ai même essayé de le reconstruire en faisant un clic droit sur le fichier .xsd dans l'Explorateur de solutions dans VS2010 et en choisissant 'Exécuter l'outil personnalisé' (Mais je ne sais pas si cela recrée vraiment le code derrière le DataSet?) – Kberg

Questions connexes