SqlDataReader C#,SQL Server 2005,VS 2008

Posted

技术标签:

【中文标题】SqlDataReader C#,SQL Server 2005,VS 2008【英文标题】:SqlDataReader 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 - 欢迎来到 ***。只是为了让您知道,您可能想要检查所有问题并将您使用的答案标记为被接受。社区通常在工作,但社区的用户仍然会抽出时间在此站点上回答问题。因此,正确的做法是标记所有已解决的问题,并使用可接受的答案。 @JonH :: 我通过单击勾选标记选择了接受的答案。我需要做些什么来将我的问题标记为已解决的问题吗?其实我是 *** 社区的新手。感谢您的建议。 【参考方案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],或者您可以遍历列表中的所有项目以输出所有名称/价格。

【讨论】:

以上是关于SqlDataReader C#,SQL Server 2005,VS 2008的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataReader C#,SQL Server 2005,VS 2008

C#利用SqlDataReader读取SQL Server数据表

SqlDataReader 和 T-SQL:在使用来自 C# 的“异步”调用时使用“try...catch”和“throw”时不会传播异常

c#中SqlDataReader dr = cmd.ExecuteReader();然后读取dr.read(),用了while循环,就一直循环了

在 C# 中将 SQL Datareader 转换为数据集

sqldatareader 中的括号