Avoir D'Erreur “Le Système De.IndexOutOfRangeException”. Pourquoi?
J'ai le Webservice suivant:
using (SqlCommand cmd = new SqlCommand(@"SELECT r.NAME, s.NAME FROM REGION r LEFT OUTER JOIN STADT s ON s.REGION_ID = r.ID ORDER BY r.NAME", con))
{
con.Open();
using (SqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
if (rdr["r.NAME"] != DBNull.Value && rdr["s.NAME"] != DBNull.Value)
{
stadtObject.Add(new STADT()
{
RegionName = rdr["r.NAME"].ToString(),
StadtName = rdr["s.NAME"].ToString()
});
}
}
}
}
J'ai testé l'Instruction SQL dans SQL Management Studio et de son travail comme un charme. Mais j'obtiens un message d'Erreur si j'invoque la Méthode dans le Navigateur :
System.IndexOutOfRangeException: r.NAME
at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
at System.Data.SqlClient.SqlDataReader.get_Item(String name)
at StadtHelper.Stadt() in C:\Users\Yeah\Documents\Visual Studio 2010\Projects\WebService1\WebService1\StadtHelper.cs:line 31
at WebService1.Service1.Stadt() in C:\Depp\Ushi\Documents\Visual Studio 2010\Projects\WebService1\WebService1\Service1.asmx.cs:line 77
Je ne sais pas ce que je fais de mal. Peut-être que vous pourrez m'aider.
Vous en remercie d'avance.
avez-vous essayez de déboguer le code? Définir un point d'arrêt au
Juste pour référence future. Cette IndexOutOfRangeException se produit également lorsque AUCUN de la colonne correspond, par exemple, dans le cas d'une faute de frappe!
rdr["r.name"]
et de voir ce qui est retourné (je ne me souviens pas et n'avez pas visual studio, mais il peut être un nul et n'est pas dbnull...)Juste pour référence future. Cette IndexOutOfRangeException se produit également lorsque AUCUN de la colonne correspond, par exemple, dans le cas d'une faute de frappe!
OriginalL'auteur Bashud | 2012-06-07
Vous devez vous connecter pour publier un commentaire.
Lorsque r.Le nom est sélectionné dans le DataReader, il ne lit que les champ nom de Nom de. Lors de la sélection des champs, il ne comprend pas le tableau de prescripteurs (r. et s.)
Il ne peut pas trouver "r.Le nom de" ou ".Name", car lors de l'évaluation, le lecteur est tout simplement le retour de deux colonnes, à la fois juste nommé "Nom" Afin de blé à la recherche pour la r.Le nom, l'exécution est sayinf que "r.Le nom n'est pas dans la liste des noms de colonnes valides" (qui se manifeste par une IndexOutOfRange exception).
Si vous voulez être en mesure d'y accéder par le nom, vous devez utiliser la déclaration de donner l'résultant en mémoire les résultats de la requête distincte des noms de champ:
Je pense que je suis en déclarant que mal, mais en substance, votre code doit être modifié comme suit:
OriginalL'auteur David
N'aime pas l'alias r, qui de cource vous donne un problème potentiel que vos noms de colonne ne sont pas uniques.
essayer quelque chose comme
Select r.Name as RName, s.Name as SName
...puis
rdr["RName"]
etrdr["SName"]
sera de spectateurs.OriginalL'auteur Tony Hopkinson
Les noms de Table ne peut pas être utilisé pour qualifier les noms de champ dans un
SqlDataReader
; le nom du champ, dans votre cas, est"NAME"
.Pour éviter le conflit de noms, vous devez renommer les colonnes de votre projection:
Ensuite, l'accès des champs en utilisant les nouveaux noms:
OriginalL'auteur Douglas
Le lecteur de données ne sait pas qui r.Le NOM est parce que les colonnes qui sont effectivement retournés sont le NOM et le NOM. Vous pouvez utiliser des alias pour différencier les deux, comme ceci:
et ensuite accéder aux données renvoyées par l'alias:
OriginalL'auteur Lucian