我有一个名为Product
的表。此表的一列称为 Naam
。它是产品的名称。当您按下按钮时,所有产品名称都必须添加到组合框中。
因此,如果我有2种产品:可乐和芬达。
程序必须仅显示组合框中的列Naam
。不是其他列。
我的按钮已经有了这个,但它不起作用。
db.AlleProducten("Select Naam from Product;", Product);
cb_product.Items.Add(Product.Naam);
这是运行查询的方法:
public void AlleProducten(string commandText, product Product)
{
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(commandText, conn))
{
conn.Open();
using (var rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
rdr.Read();
Product.Naam = rdr.GetString(1);
conn.Close();
}
}
}
}
错误:
System.Data 中发生类型为"System.IndexOutOfRangeException"的未处理异常.dll
附加信息: De index ligt buiten de matrixgrenzen.
其他信息以荷兰语提供。翻译成英文:
索引位于数组边界之外。
代码中的第一个问题是当您尝试检索 SqlDataReader 的索引 1 处的值时。您的查询只有一列,并且在 NET 数组中从索引零开始,因此您需要使用此行检索 Naam 值
Product.Naam = rdr.GetString(0);
但是,如果您有多个记录要提取 Naam 值,则需要使用 SqlDataReader 进行循环,直到它从 Read 方法返回 false,并将检索的 Naam 值存储在某种集合结构中。
我建议使用List<string>
public List<string> AlleProducten(string commandText)
{
List<string> names = new List<string>();
using (SqlConnection conn = new SqlConnection(connectionString))
using (SqlCommand cmd = new SqlCommand(commandText, conn))
{
conn.Open();
using (var rdr = cmd.ExecuteReader())
{
while(rdr.Read())
names.Add(rdr.GetString(0));
}
conn.Close();
}
return names;
}
上面的代码循环访问 SqlDataReader 的返回结果,并将每个 Naam 添加到字符串列表中,最后将列表返回给调用方。
通过这种方式,您可以将 AlleProducten 方法的返回值分配给组合框的数据源
List<string>result = db.AlleProducten("Select Naam from Product;");
cb_product.DataSource = result;
1 - 由于您使用rdr.GetString(1)
而不是rdr.GetString(0)
,因此超出了范围
2 - 代码中没有任何组合框。
using (var rdr = cmd.ExecuteReader())
{
while (reader.Read())
{
Product.Naam = rdr.GetString(0);
YourComboBox.Items.Add(Product.Naam);
}
}
看看 SqlCommand.ExecuteReader 文档。