2010-03-17 5 views
0

J'ai un contrôle Repeater dans ma page ASPX:problème répéteur étrange

<asp:Repeater ID="repeater" runat="server" EnableViewState="false"> 
    <ItemTemplate> 
     <%# Eval("someAttribute") %> 
    </ItemTemplate> 
</asp:Repeater> 

Sur Page_Load je le code suivant:

if (String.IsNullOrEmpty((string)Request.QueryString["action"])) 
    s.OpenConn("SELECT * FROM someTable;"); 
else 
    s.OpenConn("SELECT * FROM someTable WHERE id=1;"); 

if (s.Read()) 
{ 
    repeater.DataSource = s.GetRead(); 
    repeater.DataBind(); 
} 

Le problème est que quand je rentre dans l'action = quelque chose, les données ne sont pas affichées sur la page. Mais si j'enlève? Action = quelque chose, j'obtiens toutes les données.

Est-ce que je fais quelque chose de mal?

+1

Suivez-le avec un point d'arrêt sur la première ligne et parcourez une ligne à la fois inspecter les variables. Vous verrez si le flux est inattendu et pourquoi. –

Répondre

2

Vous avez déjà lu et ignoré le premier résultat dans votre instruction if. Enlevez ceci:

if (s.Read()) 
+0

Ceci est la solution. Merci. – lopkiju

2

À moins que l'objet mentionné par s ne fasse quelque chose de vraiment étrange, la seule raison pour laquelle je peux penser, c'est que someTable n'a pas de lignes avec id = 1. Avez-vous essayé d'exécuter la seconde instruction SQL directement dans Sql Server Management Studio?

+0

s est une instance de la classe pour la connexion à la base de données MSSql. Sur cette partie, tout va bien. J'ai essayé d'exécuter sql Management Studio et il y a une donnée avec id = 1. – lopkiju

5

ressemble à votre requête

s.OpenConn("SELECT * FROM someTable WHERE id=1;"); 

est rien de retour. OU, votre instruction #Eval renvoie une chaîne vide. Changez cette

<ItemTemplate> 
    <%#Eval("SomeAttribute")%> I found one! 
</ItemTemplate> 

pour vous assurer d'obtenir une sortie si la propriété .DataSource du répéteur n'est pas une liste vide. De cette façon, "j'en ai trouvé un!" sera affiché même si "SomeAttribute" est vide.

Conseils:

  1. Jamais, jamais jamais une requête directement intégrer dans un .aspx.cs. Utilisé des procédures stockées ou des requêtes paramétrées (soupir).

  2. De même, ne faites aucune interaction db dans une page codebehind. Refactorisez votre accès aux données dans une classe distincte. Vous me remercier plus tard. Google pour l'architecture à plusieurs niveaux, les tests unitaires ou la séparation des préoccupations pour une analyse plus détaillée.

  3. Vous n'avez pas besoin de transtyper les valeurs .QueryString [] en chaîne. Ils sont déjà des cordes.

  4. Définir un point d'arrêt sur

    si (s.Read())

et de voir ce qui se passe quand vous y arrivez. Cela vous aidera à trouver le problème.

+0

Les deux sqls retournent des enregistrements. C'est la première chose à vérifier. Merci pour les conseils. – lopkiju