2010-11-27 5 views
0

j'avais commande sql avec SqlDataReader mais j'ai eu cette erreursql classe lecteur de données

System.IndexOutOfRangeException: UserName

chargement de la page de l'événement:

protected void Page_Load(object sender, EventArgs e) 
{ 
    using (SqlConnection con = Connection.GetConnection()) 
    { 

     SqlCommand Com = new SqlCommand("Total", con); 
     Com.CommandType = CommandType.StoredProcedure; 
     SqlDataReader Dr = Com.ExecuteReader(); 
     if (Dr.Read()) 
     { 
      string Result= Dr["UserName"].ToString(); 
      Lbltotal.Text = Result; 
     } 
    } 
} 

Stocké Procédure:

Alter proc Total 
as 
begin 
select Count (UserName) from Registration 
end 
+0

Et quelle est votre question? Vous n'avez pas montré votre procédure stockée. Quel est le résultat obtenu? Y a-t-il une colonne 'UserName'? Évidemment pas d'exception. –

+0

Oui, vous devez inclure la procédure stockée dans votre question et également vérifier si vous avez réellement une colonne 'UserName'. – gideon

Répondre

0

Changer votre procédure de storder à:

Alter proc Total 
as 
begin 
select Count (UserName) as UserName from Registration 
end 
+0

Ce qui peut fonctionner, mais c'est un nom vraiment mauvais, d'appeler un ** compte de noms d'utilisateur ** juste 'UserName' - cela rendra plus difficile à l'avenir de maintenir ce code. Évitez-le autant que possible - si c'est un compte, appelez-le un compte! –

0

Vous ne renvoyez aucune colonne appelée UserName - vous venez de renvoyer un nombre qui n'a pas de nom de colonne explicite.

Si vous avez quelque chose comme ça - juste une seule valeur - vous pouvez aussi utiliser la méthode ExecuteScalar qui renvoie exactement une valeur:

using(SqlCommand Com = new SqlCommand("Total", con)) 
{ 
    Com.CommandType = CommandType.StoredProcedure; 

    int count = (int)Com.ExecuteScalar(); 
} 

Si vous insistez sur l'utilisation du SqlDataReader, il vous suffit d'utiliser un paramètre de position:

using(SqlCommand Com = new SqlCommand("Total", con)) 
{ 
    Com.CommandType = CommandType.StoredProcedure; 

    using(SqlDataReader Dr = Com.ExecuteReader()) 
    { 
     if (Dr.Read()) 
     { 
      string Result= Dr[0].ToString(); // take value no. 0 - the first one 
      Lbltotal.Text = Result; 
     } 
    } 
} 
Questions connexes