2013-04-01 7 views
0

J'ai des données (3 variables) à récupérer à partir de la base de données d'accès ms (tableau des produits) et de l'afficher sur la page ASPX. J'ai réussi à afficher uniquement la première ligne de données. Semble que ce problème est dans le code de page aspx dans la boucle foreach. Je ne peux tout simplement pas tourner la tête.afficher plusieurs lignes

est ici classe ProductController:

public ActionResult Index() 
    { 
     string str = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\vindom\\Desktop\\DB2.accdb"; 
     // connection string from database Properties 
     OleDbConnection con = new OleDbConnection(str); 
     OleDbCommand cmd; 
     OleDbDataReader reader; 
     con.Open(); 
     { 
      cmd = new OleDbCommand("SELECT * FROM product", con); 
      reader = cmd.ExecuteReader(); 
      while(reader.Read()) 
       { 
       ViewData["Prod_Type"] = reader.GetValue(0); 
       ViewData["Prod_N"] = reader.GetValue(1); 
       ViewData["Prod_d"] = reader.GetValue(2); 
       } 
      con.Close(); 


     return View(); 
    } 
    } 

Et voici le code ASPX:

<table> 
    <tr> 
    <th>Product Type</th> 
    <th>Product Number</th> 
    <th>Product Details</th> 
    <th></th> 
    </tr> 
    <%@foreach (var item in View) 
    {%> 
<tr> 
<td><%= Html.Encode(ViewData["Prod_Type"]) %></td> 
<td><%= Html.Encode(ViewData["Prod_N"]) %></td> 
<td><%= Html.Encode(ViewData["Prod_d"]) %></td> 
</tr> 
<%}%> 
</table> 

..et Product.cs

namespace Tok.Models 
{ 
    public class Product 
    { 
     public string Product_Type { get; set; } 
     public string Product_NUM { get; set; } 
     public string Product_desc { get; set; } 

     public ICollection<Process> Processes; 
    } 

    public class Process 
    { 
     public string ProcessId { get; set; } 
     public string Process_desc { get; set; } 
     public string Next_processs { get; set; } 

     public virtual Product Product { get; set; } 
    } 
} 
+0

J'ai modifié votre titre. S'il vous plaît voir, "[Les questions devraient inclure" tags "dans leurs titres?] (Http://meta.stackexchange.com/questions/19190/)", où le consensus est "non, ils ne devraient pas". –

Répondre

2

Essayez l'approche au dessous de. Cela va parcourir votre jeu d'enregistrements, mais ce que vous avez dans votre vue ne fonctionnera pas. Vous devez stocker vos lignes dans une forme de collection, ViewData ["Prod_XXX"] est pour des instances uniques de données, et non plusieurs lignes.

Vous pouvez construire une liste de lignes comme ceci:

List<Prod> prodRows = new List<Prod>(); 
while (reader.Read()) 
{ 
    prodRows.Add(new Prod 
    { 
     Prod_Type = reader.GetValue(0), 
     Prod_N = reader.GetValue(1), 
     Prod_d = reader.GetValue(2) 
     }); 
} 

où Prod est une classe définie ainsi:

public class Prod 
{ 
    public string Prod_Type { get; set; } 
    public string Prod_N { get; set; } 
    public string Prod_d { get; set; } 
} 

Alors à votre avis, vous pourriez avoir quelque chose comme ceci:

@model List<Prod> 
@foreach(var row in Model) 
{ 
    //Your display HTML 
} 

Ce n'est pas une réponse exacte, mais j'espère que cela aide.

+0

Je pense que le reader.MoveNext() entraînera l'omission d'une ligne, puisque 'reader.Read()' lira la ligne suivante. –

+0

Bien noté Ann - la dernière fois que j'ai utilisé ADO était de retour avec VB6 il y a environ 10 ans, et vous avez l'habitude de while (! Reader.EOF) {// faire des choses reader.MoveNext()} –

+0

À ce stade, vous êtes en train de sauter lignes à cause de '.Read()' et '.MoveNext()'. S'il vous plaît supprimer le '.MoveNext()' comme il est 100% inutile dans cette réponse. A part ça, c'est la bonne réponse. Faites-le, et vous aurez au moins un vote de plus. – Joshua

0

Votre problème est que, de l'apparence des choses, vous exécuter ce code:

ViewData["Prod_Type"] = reader.GetValue(0); 
ViewData["Prod_N"] = reader.GetValue(1); 
ViewData["Prod_d"] = reader.GetValue(2); 

... trois fois, mais chaque fois que vous écrasez la précédente série de valeurs.

Vous ne semblez pas non plus passer un modèle à votre vue. Puisque vous voulez parcourir une liste de données, vous devez définir une classe pour représenter l'enregistrement du modèle (probablement Product ou quelque chose de similaire), et passer à votre vue une collection de Product enregistrements que vous avez compilés.

Quelque chose comme ceci (en supposant que vous avez une classe Product):

List<Product> model = new List<Product>(); 
while(reader.Read()) 
{ 
    Product newEntry = new Product() { 
    Prod_Type = reader.GetValue(0), // I'm ignoring the need to cast the values 
    Prod_N = reader.GetValue(1), 
    Prod_d = reader.GetValue(2) 
    }; 
    model.Add(newEntry); 
} 
// housekeeping 
return View(model); 
+0

Oui, j'ai une classe de produit .. Désolé aurait dû mentionner que ...Ici: –

+0

J'ai édité la question d'origine (seul moyen de coller le code) –

+0

Je reçois erreur sur la ligne de page aspx <% @foreach (var article dans le modèle) {%> .... Il dit que le bloc de serveur est pas bien formé –

Questions connexes