【问题标题】:SqlDataReader C#, SQL Server 2005, VS 2008SqlDataReader C#,SQL Server 2005,VS 2008
【发布时间】:2011-04-01 03:44:29
【问题描述】:

我正在尝试使用 C# 和 VS 2008 从 SQL Server 2005 中的 t_Food 表中选择 food_ItemNamefood_UnitPrice

我有以下代码:

私有 SqlConnection 连接; 私人无效GetDatabaseConnection() { string connectionString = @"服务器 = RZS-F839AD139AA\SQLEXPRESS;集成安全 = SSPI;数据库 = HotelCustomerManagementDatabase"; 连接 = 新的 SqlConnection(connectionString); 连接.打开(); } 公共食物 PopulateFoodItemListview() { 获取数据库连接(); string selectFoodItemQuery = @"SELECT food_ItemName, food_UnitPrice FROM t_Food"; SqlCommand command = new SqlCommand(selectFoodItemQuery, connection); SqlDataReader 阅读器 = command.ExecuteReader(); 食物食物=新食物(); 列出 foodList = new List(); 而(读者。读()) { food.ItemName.Add(reader.GetString(0)); MessageBox.Show("ItemName: "+ food.ItemName); food.UnitPrice.Add(reader.GetDouble(1)); MessageBox.Show("单价:" + food.UnitPrice); } 连接。关闭(); 返还食物; }

Food 类中,我有以下代码:

公共课食品 { 私有列表 itemName = new List(); 私有列表 unitPrice = new List(); 私人双itemUnit; 私人客户 foodCustomer = new Customer(); 公共列表项目名称 { 获取{返回项目名称; } 设置 { itemName = value ; } } 公开列表单价 { 得到{返回单位价格; } 设置{单位价格=价值; } } public double ItemUnit { 得到{返回itemUnit; } 设置 { itemUnit = 值; } } 公共双GetItemPrice(双itemUnit,双unitPrice) { 双 itemPrice = itemUnit*unitPrice; 返回项目价格; } }

在 messageBox 中,它应该显示 Rice、Mutton、Beef 及其价格 50、100、150。但它显示 ItemName: System.Collections.Generic.List`1[System.String]ItemName: System.Collections.Generic.List`1[System.Double]

有什么问题?

【问题讨论】:

  • 您是否遇到任何错误?您的 SQL 查询是否返回了所需的数据?
  • 请注意,最好尽可能使用泛型集合。最好不要在公开这些集合的属性上提供设置器。
  • @towhidulbashar - 欢迎来到 stackoverflow。只是为了让您知道,您可能想要检查所有问题并将您使用的答案标记为被接受。社区通常在工作,但社区的用户仍然会抽出时间在此站点上回答问题。因此,正确的做法是标记所有已解决的问题,并使用可接受的答案。
  • @JonH :: 我通过单击勾选标记选择了接受的答案。我需要做些什么来将我的问题标记为已解决的问题吗?其实我是 Stackoverflow 社区的新手。感谢您的建议。

标签: c# sql


【解决方案1】:

您应该指定:

private List<string> itemName;

这样,当您添加名称时,您可以这样做:

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

您注意到的问题是 food.itemName 只是一个列表而不是字符串。 因此,您可以通过以下方式从列表中获取字符串:myList[someIndex],,即您的 List 对象,后跟列表中项目的索引。

一旦你填写了你的食物 itemName 列表,你应该能够 foreach 它:

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

除此之外,我有点担心这个类的措辞。 如果一个 Food 对象代表一个食物实体,那么为什么 itemName 和 price list 是这个类的成员?它们应该分别是stringdouble 类型的属性。创建食物对象时,该对象包含名称和价格。

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

【讨论】:

  • 我同样担心。看我的回答。
  • @Chirs :: 是的,你是对的。我是 OOP 的新手。所以我无法理解 FOOD 类的概念。 @MusiGenesis:: 我看到你回答了。感谢您的详细回答。
  • 只是好奇:为什么要密封这些类?
  • @MusiGenesis - 我没有理由在这里做很多例子。我是 Richter 的粉丝,一般来说,如果您不打算扩展课程,请密封它。但你可以没有它。
【解决方案2】:

food.ItemName 是一个列表,而不是字符串,因此 ToString() 返回类型。你想要的是:

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

单价也一样:

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

【讨论】:

    【解决方案3】:

    您的Food 类旨在代表一种食物,因此您的itemNameunitPrice 成员应分别为stringdouble 类型(而不是List,使用存储多个值)。

    然后,PopulateFoodItemListview 应该返回 List&lt;Food&gt;(而不是 Food)。在您的reader.Read() 循环中,您应该创建一个新的Food 实例,使用数据库中的适当值填充它,然后将其添加到您的List&lt;Food&gt; 集合中(然后在方法结束时返回该集合)。

    更新:像这样:

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

    【讨论】:

    • 您错过了将食物对象添加到List&lt;food&gt; foods 对象。否则你会返回一个空列表。
    • 实际上我正在编写此代码以在 ListView 中显示食物名称及其单价。但是,如果我返回作为“食物”列表的“食物”,那么我如何在另一个类的 ListView 中显示它们?为什么你写这个“List foodList = new List();”
    • @towhidulbashar:将List&lt;Food&gt; 集合转储到ListView 很容易——只需执行foreach 迭代并为ListView 中的每个Food 对象添加一个ListViewItem集合。顺便说一句,我不知道在我的代码中 foodList 是如何更改为 List&lt;string&gt; 的 - 我认为 Visual Studio 在我粘贴您的原始代码时做到了。 foodList 无论如何都不会在任何地方使用,所以这并不重要。
    • @MusiGenesis :: 好的,我在 ListView 上显示了它,但只添加了最后一个“食物”对象的值。这意味着我无法在 ListView 中添加新行。如何在 ListView 中添加新的 roe?
    • @MusiGenesis :: 我又回来了,只是说我终于可以在 ListView 中显示它们了。
    【解决方案4】:

    ItemName 和 UnitPrice 是 List 对象,而不是单个项目。当您将对象传递给 MessageBox 函数时,它将在对象上调用 ToString() 以获取可显示的字符串。 List 上的 ToSting() 返回您看到的字符串。您应该使用索引来获取列表中的项目:

    MessageBox(ItemName(1));
    

    MessageBox(UnitPrice(1));
    

    【讨论】:

      【解决方案5】:

      问题在于 food.Item 名称返回 List&lt;string&gt;,而您正在对 List&lt;string&gt;::ToString 进行隐式调用,该调用返回类型的详细信息。您应该将最后输入的项目请求为food.ItemName[food.ItemName.Count - 1],或者您可以遍历列表中的所有项目以输出所有名称/价格。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多