2010-08-19 9 views
1

Je suis en train de sélectionner food_ItemName et food_UnitPrice de t_Food table dans SQL Server 2005 en utilisant C# et VS 2008.SqlDataReader C#, SQL Server 2005, VS 2008

Je le code suivant:

 
     private SqlConnection connection; 

     private void GetDatabaseConnection() 
     { 
      string connectionString = @"Server = RZS-F839AD139AA\SQLEXPRESS; Integrated Security = SSPI; Database = HotelCustomerManagementDatabase"; 
      connection = new SqlConnection(connectionString); 
      connection.Open(); 
     } 

     public Food PopulateFoodItemListview() 
     { 
      GetDatabaseConnection(); 
      string selectFoodItemQuery = @"SELECT food_ItemName, food_UnitPrice FROM t_Food"; 
      SqlCommand command = new SqlCommand(selectFoodItemQuery, connection); 
      SqlDataReader reader = command.ExecuteReader(); 
      Food food = new Food(); 
      List foodList = new List(); 

      while (reader.Read()) 
      { 
       food.ItemName.Add(reader.GetString(0)); 
       MessageBox.Show("ItemName: "+ food.ItemName); 
       food.UnitPrice.Add(reader.GetDouble(1)); 
       MessageBox.Show("UnitPrice: " + food.UnitPrice); 

      } 
      connection.Close(); 
      return food; 
     } 

et dans la classe Food je le code suivant:

 
    public class Food 
    { 
     private List itemName = new List(); 
     private List unitPrice = new List(); 
     private double itemUnit; 
     private Customer foodCustomer = new Customer(); 

     public List ItemName 
     { 
      get { return itemName; } 
      set { itemName = value ; } 
     } 

     public List UnitPrice 
     { 
      get { return unitPrice; } 
      set { unitPrice = value; } 
     } 

     public double ItemUnit 
     { 
      get { return itemUnit; } 
      set { itemUnit = value; } 
     } 
     public double GetItemPrice(double itemUnit, double unitPrice) 
     { 
      double itemPrice = itemUnit*unitPrice; 
      return itemPrice; 
     } 
} 

en messageBox il censé montrer Rice, Mutton , Boeuf et leur prix 50, 100, 150. Mais il montre ItemName: System.Collections.Generic.List`1[System.String] et ItemName: System.Collections.Generic.List`1[System.Double]

Quel est le problème?

+0

Obtenez-vous des erreurs? Votre requête SQL renvoie-t-elle les données souhaitées? –

+0

Juste une note, c'est une bonne pratique d'utiliser des collections génériques quand vous le pouvez. Il est préférable de ne pas fournir de setters aux propriétés qui exposent ces collections. – Marc

+0

@towhidulbashar - bienvenue sur stackoverflow. Juste pour vous faire savoir que vous voudrez peut-être passer par toutes vos questions et marquer une réponse que vous avez utilisée comme étant acceptée. La communauté est habituellement au travail mais les utilisateurs de la communauté prennent toujours le temps de répondre aux questions sur ce site. Donc, il est certainement la bonne chose à faire est de marquer toutes vos questions qui sont résolues avec une réponse acceptée. – JonH

Répondre

4

Vous devez spécifier:

private List<string> itemName; 

De cette façon, lorsque vous ajoutez un nom que vous pouvez faire:

itemName = new List<string>(); 
itemName.Add("Pizza"); 

Le problème que vous remarquez est food.itemName est simplement une liste non une chaîne. Vous pouvez donc obtenir la chaîne d'une liste par: myList[someIndex], qui est votre objet Liste suivi de l'index de l'article dans votre liste.

Une fois que vous remplissez votre nourriture itemName liste vous devriez être en mesure de foreach il:

foreach(string f in food.itemName) 
MessageBox.Show(f); 

En dehors de cela, je suis un peu préoccupé par le libellé de cette classe. Si un objet Food représente une entité de nourriture alors pourquoi itemName et prix list membres de cette classe? Ils devraient simplement être des propriétés de type string et double respectivement. Lorsque vous créez un objet alimentaire, l'objet contient un nom et un prix.

public sealed class Food 
{ 
public string itemName {get; set;} 
public double unitPrice {get; set;} 
} 

Voici comment vous pouvez le faire:

public sealed class Food 
{ 
    public string itemName {get; set;} 
    public double unitPrice {get; set;} 
    public double itemUnit {get; set;} 
    public double getItemPrice() { return itemUnit * unitPrice; } 
    public Food() : this("unknown food", 0); 
    public Food(string item, double price) { itemName = item; unitPrice = price; } 

    //you might want to rethink your customer object as well. Are 
    //you associating one customer with one item of food ? 
} 

Et comment utiliser la classe:

public sealed class MyUsageOfFood 
{ 
public static void main() { 
    List<Food> f = new List<Food>; 
    f.Add(new Food("Pizza", 1.50)); 
    f.Add(new Food("Hamburger", 2.00)); 

    foreach(food t in f) 
     MessageBox.Show(t.itemName); 
}} 
+1

+1 pour les commentaires sur les incohérences apparentes dans la conception des classes. – Chris

+0

Je suis également concerné. Vois ma réponse. – MusiGenesis

+0

@Chirs :: Oui, vous avez raison. Im nouveau dans OOP. Donc, je ne peux pas attraper le concept de classe alimentaire. @MusiGenesis :: Je vous vois répondre. Merci pour vos détails réponse. – Towhid

4

food.ItemName est une liste, pas une chaîne, de sorte que le ToString() renvoie le type. Qu'est-ce que vous voulez à la place:

food.ItemName[food.ItemName.Count - 1] 

et même pour UnitPrice:

food.UnitPrice[food.UnitPrice.Count - 1].ToString() 
+0

+1 - court et doux. – JonH

0

NomRubrique et UnitPrice sont des objets Liste, pas des objets. Lorsque vous passez des objets à la fonction MessageBox, il appelle ToString() sur l'objet pour obtenir une chaîne affichable. ToSting() dans une liste renvoie les chaînes que vous voyez. Vous devez utiliser les index pour obtenir à des éléments dans la liste:

MessageBox(ItemName(1)); 

ou

MessageBox(UnitPrice(1)); 
0

Le problème est que la nourriture.Le nom d'élément renvoie un List<string> et vous effectuez l'appel implicite à List<string>::ToString qui renvoie des détails sur le type. Vous devez soit demander le dernier élément entré comme food.ItemName[food.ItemName.Count - 1], soit parcourir tous les éléments de la liste pour afficher tous les noms/prix.

1

Votre Food classe est censée représenter un seul élément de nourriture, de sorte que vos itemName et unitPrice membres doivent être de type string et double, respectivement (non List, qui est utilisé pour stocker plusieurs valeurs).

Ensuite, PopulateFoodItemListview doit renvoyer List<Food> (pas Food). Dans votre boucle reader.Read(), vous devez créer une nouvelle instance Food, la remplir avec les valeurs appropriées de la base de données, puis l'ajouter à votre collection List<Food> (qui est ensuite renvoyée à la fin de la méthode).

Mise à jour: Comme ceci:

public List<Food> PopulateFoodItemListview() 
{ 
    GetDatabaseConnection(); 
    string selectFoodItemQuery = @"SELECT food_ItemName, food_UnitPrice FROM t_Food"; 
    SqlCommand command = new SqlCommand(selectFoodItemQuery, connection); 
    SqlDataReader reader = command.ExecuteReader(); 
    List<Food> foods = new List<Food>(); 
    List<string> foodList = new List<string>(); 

    while (reader.Read()) 
    { 
     Food food = new Food(); 
     food.ItemName = reader.GetString(0); 
     MessageBox.Show("ItemName: "+ food.ItemName); 
     food.UnitPrice = reader.GetDouble(1); 
     MessageBox.Show("UnitPrice: " + food.UnitPrice); 
     foods.Add(food); 
    } 
    connection.Close(); 
    return foods; 
} 

public class Food 
{ 
    private string itemName = ""; 
    private double unitPrice = 0.0; 
    private double itemUnit; 

    private Customer foodCustomer = new Customer(); 

    public string ItemName 
    { 
     get { return itemName; } 
     set { itemName = value ; } 
    } 

    public double UnitPrice 
    { 
     get { return unitPrice; } 
     set { unitPrice = value; } 
    } 

    public double ItemUnit 
    { 
     get { return itemUnit; } 
     set { itemUnit = value; } 
    } 
    public double GetItemPrice(double itemUnit, double unitPrice) 
    { 
     double itemPrice = itemUnit*unitPrice; 
     return itemPrice; 
    } 
} 
+0

Vous avez manqué d'ajouter un objet alimentaire à l'objet 'List foods'. Sinon, vous retourneriez une liste vide. – JonH

+0

Oups, merci. L'examen du code est une bonne chose! – MusiGenesis

+0

En fait, j'écris ce code pour montrer le nom de la nourriture et leur prix unitaire dans un ListView. Mais si je retourne "aliments" qui est une liste de "nourriture" alors comment je leur montre dans un ListView d'une autre classe? Et pourquoi écrivez-vous "Liste foodList = new Liste ();" – Towhid

Questions connexes