SqlDataReader C #, SQL Server 2005, VS 2008 - PullRequest
       0

SqlDataReader C #, SQL Server 2005, VS 2008

1 голос
/ 19 августа 2010

Я пытаюсь выбрать food_ItemName и food_UnitPrice из таблицы t_Food в SQL Server 2005 с использованием C # и VS 2008.

У меня есть следующий код:

        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;
        }

И в Food классе у меня есть следующий код:

    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;
        }
}

В messageBox он должен показывать рис, баранину, говядину и их цену 50, 100, 150. Но он показывает ItemName: System.Collections.Generic.List`1[System.String] и ItemName: System.Collections.Generic.List`1[System.Double]

В чем проблема?

Ответы [ 5 ]

4 голосов
/ 19 августа 2010

food.ItemName - это список, а не строка, поэтому ToString () возвращает тип.Вместо этого вы хотите:

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

и то же самое для UnitPrice:

food.UnitPrice[food.UnitPrice.Count - 1].ToString()
4 голосов
/ 19 августа 2010

Вы должны указать:

private List<string> itemName;

Таким образом, когда вы добавляете имя, вы можете сделать:

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

Проблема, которую вы замечаете, это food.itemName - это просто список, а нестрока.Таким образом, вы можете получить строку из списка следующим образом: myList[someIndex], это ваш объект List, за которым следует индекс элемента в вашем списке.

После того, как вы заполните свой список itemName, вы сможете его использовать.:

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

Помимо этого, я немного обеспокоен формулировками этого класса. Если объект Food представляет одну сущность пищи, то почему itemName и цена list членыэтого класса?Они должны быть просто свойствами типа string и double соответственно.Когда вы создаете объект питания, объект содержит имя и цену.

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

Вот как вы могли бы это сделать:

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 ?
 }

А как использовать класс:

 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 голос
/ 19 августа 2010

Ваш класс Food предназначен для представления одного элемента питания, поэтому члены itemName и unitPrice должны быть типа string и double соответственно (не List, который используетсядля хранения нескольких значений).

Затем PopulateFoodItemListview должен вернуть List<Food> (не Food).Внутри вашего цикла reader.Read() вы должны создать новый экземпляр Food, заполнить его соответствующими значениями из базы данных, а затем добавить его в вашу коллекцию List<Food> (которая затем возвращается в конце метода).

Обновление: Как это:

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 голосов
/ 19 августа 2010

Проблема в том, что food.Item имя возвращает List<string>, и вы делаете неявный вызов List<string>::ToString, который возвращает сведения о типе.Вам следует либо запросить последний введенный элемент как food.ItemName[food.ItemName.Count - 1], либо вы можете перебрать все элементы в списке, чтобы вывести все названия / цены.

0 голосов
/ 19 августа 2010

ItemName и UnitPrice являются объектами списка, а не отдельными элементами.Когда вы передаете объекты в функцию MessageBox, она вызывает ToString () для объекта, чтобы получить отображаемую строку.ToSting () в List возвращает строки, которые вы видите.Вы должны использовать индексы для доступа к элементам в списке:

MessageBox(ItemName(1));

или

MessageBox(UnitPrice(1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...