【问题标题】:SQL Server Column to Combobox?SQL Server 列到组合框?
【发布时间】:2017-01-07 22:45:34
【问题描述】:

我有一张名为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.dll 中出现“System.IndexOutOfRangeException”类型的未处理异常

附加信息:De index ligt buiten de matrixgrenzen。

附加信息为荷兰语。翻译成英文:

索引位于数组边界之外。

【问题讨论】:

  • 你没有填充任何组合框。
  • 您的查询中只有一列。可以使用索引 0 而不是索引 1 检索此列。在 NET 数组中,索引从零开始
  • 所以因为我已经在查询中只选择了 1 列,所以我只有 1 列?以为我需要整个表的索引。
  • 没错,SqlDataReader 内部数组的维度是根据检索到的列数。

标签: c# sql sql-server visual-studio executereader


【解决方案1】:

代码中的第一个问题是当您尝试检索 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方法的返回值赋值给combobox的DataSource

List<string>result = db.AlleProducten("Select Naam from Product;");
cb_product.DataSource = result;

【讨论】:

  • 太棒了!我也在考虑使用列表。在编辑之前,您有 names.Add(rdr.GetString(1));你把它改成了0。和我一样的错误? :P 还是有特定的原因?
  • 不,这是一个简单的复制/粘贴错误
  • 你为什么使用 while 循环而不是 for each 循环?它做同样的事情,对吧?至少学校教过我。
  • 因为我们需要检查 rdr.Read 的返回值来停止循环。你如何使用 foreach 循环来做到这一点?
  • 计算将其添加到 int A 的列并为 int A 运行 foreach?
【解决方案2】:

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 文档。

【讨论】:

  • 有一个组合框,叫做 cb_product。但那是我的形式。执行的方法在另一个类中。我不能在课堂上使用“System.Windows.Forms”。感谢学校。我解决了索引的问题,只是我犯了一个愚蠢的错误。但是当我运行这段代码时,我只得到了表中的第一个“产品”。第二个没有弹出
  • 您的查询中没有 WHERE 子句。 Select Naam from Product Where ProductId = SelectedProduct
  • 然后你得到选择的产品。组合框必须包含数据库中的所有产品名称。所以它应该运行从产品中选择名称。如果它获得 X 列,它应该将所有 X 产品名称添加到组合框中。抱歉我的解释不好
  • 我不清楚,您说:Coca &amp; Fanta,即 2 个产品,您如何期望仅使用 Naam 获取 2 个产品?
  • 是的,那是我的问题。我正在尝试学习使用这些课程。对不起。我不得不使用循环
猜你喜欢
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多