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_ItemName
和 food_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
类中,我有以下代码:
在 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
是这个类的成员?它们应该分别是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);
【讨论】:
我同样担心。看我的回答。 @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
类旨在代表一种食物,因此您的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;
【讨论】:
您错过了将食物对象添加到List<food> foods
对象。否则你会返回一个空列表。
实际上我正在编写此代码以在 ListView 中显示食物名称及其单价。但是,如果我返回作为“食物”列表的“食物”,那么我如何在另一个类的 ListView 中显示它们?为什么你写这个“ListList<Food>
集合转储到ListView
很容易——只需执行foreach
迭代并为ListView
中的每个Food
对象添加一个ListViewItem
集合。顺便说一句,我不知道在我的代码中 foodList
是如何更改为 List<string>
的 - 我认为 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<string>
,而您正在对 List<string>::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循环,就一直循环了