2013-03-09 3 views
1

J'ai une ObjectDataSource avec un paramètre provenant d'une chaîne de requête. Je reçois l'erreur suivante:

Value was either too large or too small for an Int32.

Je crois que la chaîne de requête peut être trop longue pour son type de données. L'InfoSheetID est rempli à partir de la base de données. Y at-il une autre option que je peux prendre ou modifier l'ObjectDataSource pour empêcher l'erreur?ASP.net ObjectSource Parameter

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
OldValuesParameterFormatString="original_{0}" 
     SelectMethod="GetInfoByInfoID" 
     TypeName="BLL.InfoViewBLL"> 
     <SelectParameters> 
      <asp:QueryStringParameter DefaultValue="2148663911" Name="InfoSheetID" 
       QueryStringField="InfoSheetID" Type="Int32" /> 
     </SelectParameters> 
    </asp:ObjectDataSource> 
+0

En plus des problèmes de longueur potentiels, réfléchissez à la manière dont vous pourriez gérer une valeur arbitraire non-entière entrée par l'utilisateur. Par exemple 267.52 ou "bonjour". Dans la plupart des cas, cela ne posera pas de problème, mais l'envoi de valeurs aveugles entraînera des exceptions dans ces situations et la chaîne de requête est particulièrement facile à modifier. – pwdst

Répondre

2

Int32.MaxValue est 2'147'483'647, qui est inférieure à 2'148'663'911 que vous utilisez.

Vous pouvez changer le type en Int64 ou refactore votre code pour éviter d'utiliser des valeurs aussi grandes.

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
OldValuesParameterFormatString="original_{0}" 
     SelectMethod="GetInfoByInfoID" 
     TypeName="BLL.InfoViewBLL"> 
     <SelectParameters> 
      <asp:QueryStringParameter DefaultValue="2148663911" Name="InfoSheetID" 
                ^^^^^^^^^^ 
       QueryStringField="InfoSheetID" Type="Int64" /> 
                ^^^^^ 
     </SelectParameters> 
    </asp:ObjectDataSource> 
+0

Merci. J'ai essayé cela et j'ai obtenu l'erreur suivante.'Object de type 'System.Int64' ne peut pas être converti en type 'System.Int32' .' Dans la source de données configure, lorsqu'on lui a demandé de choisir une méthode, il n'a que GetInfoByInfoID (Int32 InfoSheetID) , renvoie l'option InfoDataTable disponible. Non Int64. –

+0

L'erreur est que DefaultValue = "2148663911". Assurez-vous que vous avez vraiment besoin de ce numéro. Vous pouvez également utiliser une chaîne au lieu de Int32 et créer un int.TryParse() pour la méthode GetInfoByInfoID(). Quoi qu'il en soit, je préférerais voir la valeur par défaut == 0 ou -1 selon la tâche. – Warlock

+0

Je ne mets que la valeur par défaut pour montrer les nombres de la chaîne de requête. Il est supprimé sans valeur par défaut. Je vais essayer TryParse() –