2010-06-04 2 views
1

La couche de données de mon application ASP.Net appelle un proc stocké pour obtenir une petite quantité (un enregistrement) d'informations sur un visiteur lors de la connexion. Je passe leur numéro de téléphone et le sproc, en utilisant un simple SELECT, repasse 5 champs, dont le premier est la clé primaire, un BIGINT. Ma couche de données obtient le DataRow et essaie de créer un objet de données avec elle. Dans l'objet de données, la propriété qui représente la clé primaire est Int64. Cela ressemble à ceci:Désabonnement d'un champ non typé dans un DataRow sans erreur de transtypage

sub = new PersistentSubscriber((String) dr["UserFirstName"], 
     (String) dr["UserLastName"], 
     phoneNumber, (Int64) dr["UserId"], (Byte) dr["SubscriberStatus"]); 

Ce que je trouve est que tout fonctionne très bien quand j'ai une grande valeur de clé primaire, comme 88698. Cependant, quand je reçois un petit, comme 999, je reçois un Erreur "Cast spécifié non valide" lors de la tentative de configuration de cette propriété de clé primaire. Lorsque je tente de jouer avec elle dans la fenêtre immédiate, je reçois ceci:

?(Int64)dr["UserId"] 
Cannot unbox 'dr["UserId"]' as a 'long' 
?(int)dr["UserId"] 
999 
?(Int32)dr["UserId"] 
999 

Sans le recours à un ensemble de données typé, ce que je fais mal, ici?

+0

En ce qui appelle la conversion comme Convert et TryParse aller, je suppose que cela fonctionnera, mais je suis plus préoccupé par « pourquoi » ai-je besoin de le faire du tout? 999 est un Int32 valide tout comme c'est un Int64 valide. Pourquoi devrais-je faire une conversion quelconque? Si je sais que ce ne sera jamais plus gros que ce que le type peut supporter, je devrais être bon à y aller. –

Répondre

1

Essayez de donner Int64.TryParse un tir.

long userId; 
if(Int64.TryParse(dr["UserId"], out userId)) 
{ 
    // successful conversion 
} 
2

Attribuées Je déterrer une vieille question, mais il me est apparu dans une recherche google en haut alors pourquoi ne pas ...

Avez-vous entendu parler de DataSetExtensions? Ils vous permettent d'accéder aux champs d'un DataRow d'une manière fortement typée. Ceci est extrêmement utile dans les requêtes linq, et dans mon expérience peut être significativement plus rapide que d'appeler DataTable.Select().

Ajoutez simplement une référence à System.Data.DataSetExtensions à votre projet, et vous êtes prêt à les utiliser.

Dans l'exemple:

Int64 value = dr.Field<Int64>("UserId"); 

dr.SetField("UserId", value); 
Questions connexes