Désabonnement d'un champ non typé dans un DataRow sans erreur de diffusion

La couche de données de mon application ASP.Net appelle un proc stocké pour get une petite quantité (un logging) d'informations sur un visiteur lors de la connection. 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 key primaire, un BIGINT. Ma couche de données obtient le DataRow et essaie de créer un object de données avec elle. Dans l'object de données, la propriété qui représente la key primaire est Int64. Cela ressemble à ceci:

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

Ce que je trouve c'est que tout fonctionne très bien quand j'ai une grande valeur de key primaire, comme 88698. Cependant, quand j'en ai une petite, comme 999, j'obtiens une erreur "La dissortingbution spécifiée est invalide" en essayant de configurer cette propriété de key primaire. Lorsque j'essaie de jouer avec dans la window Exécution, j'obtiens ceci:

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

Sans avoir recours à un jeu de données typé, qu'est-ce que je fais de mal, ici?

Certes, je suis en train de creuser une vieille question, mais il s'est présenté pour moi dans une search google près du sumt alors pourquoi 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 reference à System.Data.DataSetExtensions à votre projet, et vous êtes prêt à les utiliser.

Par exemple:

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

Essayez de donner Int64.TryParse un tir.

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