SQL 服务器列到组合框?
SQL Server Column to Combobox?
我有一个叫 Product
的 table。此 table 的其中一列称为 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();
}
}
}
}
错误:
An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
Additional information: De index ligt buiten de matrixgrenzen.
附加信息为荷兰语。翻译成英文:
The index is located outside of the array bounds.
1 - 您超出了范围,因为您使用的是 rdr.GetString(1)
而不是 rdr.GetString(0)
2 - 您的代码中没有任何 ComboBox。
using (var rdr = cmd.ExecuteReader())
{
while (reader.Read())
{
Product.Naam = rdr.GetString(0);
YourComboBox.Items.Add(Product.Naam);
}
}
查看 SqlCommand.ExecuteReader 文档。
代码中的第一个问题是当您尝试检索 SqlDataReader 的索引 1 处的值时。您的查询只有一列,并且在 NET 数组中从索引零开始,因此您需要使用此行
检索 Naam 值
Product.Naam = rdr.GetString(0);
但是,如果您有多个记录来提取 Naam 值,那么您需要使用 SqlDataReader 进行循环,直到它从 Read 方法中 return 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 的 returned 结果,并将每个 Naam 添加到字符串列表,最后 return 将列表发送给调用者。
通过这种方式,您可以将 AlleProducten 方法的 return 值分配给组合框的 DataSource
List<string>result = db.AlleProducten("Select Naam from Product;");
cb_product.DataSource = result;
我有一个叫 Product
的 table。此 table 的其中一列称为 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();
}
}
}
}
错误:
An unhandled exception of type 'System.IndexOutOfRangeException' occurred in System.Data.dll
Additional information: De index ligt buiten de matrixgrenzen.
附加信息为荷兰语。翻译成英文:
The index is located outside of the array bounds.
1 - 您超出了范围,因为您使用的是 rdr.GetString(1)
而不是 rdr.GetString(0)
2 - 您的代码中没有任何 ComboBox。
using (var rdr = cmd.ExecuteReader())
{
while (reader.Read())
{
Product.Naam = rdr.GetString(0);
YourComboBox.Items.Add(Product.Naam);
}
}
查看 SqlCommand.ExecuteReader 文档。
代码中的第一个问题是当您尝试检索 SqlDataReader 的索引 1 处的值时。您的查询只有一列,并且在 NET 数组中从索引零开始,因此您需要使用此行
检索 Naam 值Product.Naam = rdr.GetString(0);
但是,如果您有多个记录来提取 Naam 值,那么您需要使用 SqlDataReader 进行循环,直到它从 Read 方法中 return 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 的 returned 结果,并将每个 Naam 添加到字符串列表,最后 return 将列表发送给调用者。
通过这种方式,您可以将 AlleProducten 方法的 return 值分配给组合框的 DataSource
List<string>result = db.AlleProducten("Select Naam from Product;");
cb_product.DataSource = result;