【问题标题】:How to solve "Index was outisde the bound of the array" error?如何解决“索引超出数组范围”错误?
【发布时间】:2012-12-28 07:12:19
【问题描述】:

您好,我正在使用此代码从 MySQL 数据库上的 5 个不同表中获取所需的数据。

private void goDateBtn_Click(object sender, EventArgs e)
        {
            reportList.Items.Clear();
            var db = new DBConnect();
            MySqlCommand cmd = null;
            MySqlDataReader dr = null;
            double totalsales = 0;
            try
            {
                if (db.OpenConnection() == true)
                {

                    string cmdstr = "SELECT ol.*, o.*, m.* "+
                                    "FROM orderlist ol "+
                                    "INNER JOIN orderdb o ON ol.order_ID = o.order_ID "+
                                    "INNER JOIN menudb m ON ol.menu_ID = m.menu_ID "+
                                    "INNER JOIN recipelist r ON r.menu_ID = m.menu_ID "+
                                    "INNER JOIN "+
                                    "( SELECT stock_ID, SUM(stock_pricePerPiece) menu_cost "+
                                        "FROM stocksdb "+
                                        "GROUP BY stock_ID )"+
                                    "s ON r.stock_ID = s.stock_ID "+
                                    "WHERE o.order_date >= #" + fromDate.Value.Date + "# AND " +
                                        "o.order_date <= #" + toDate.Value.Date + "#";
                    cmd = new MySqlCommand(cmdstr, db.mycon);
                    dr = cmd.ExecuteReader();
                    string[] info = new string[20];
                    while (dr.Read())
                    {
                        info[1] = (dr["order_ID"].ToString());
                        info[2] = (dr["order_date"].ToString());
                        info[3] = (dr["menu_name"].ToString());
                        info[4] = (dr["menu_cost"].ToString());
                        info[5] = (dr["menu_price"].ToString());
                        info[6] = (Convert.ToDouble(info[5]) - Convert.ToDouble(info[4])).ToString("#0.00");
                        this.reportList.Items.Add(new ListViewItem(new string[] { info[1], info[2], info[3], info[4], info[5], info[6] }));

                        totalsales += Convert.ToDouble(info[6]);
                    }
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                db.CloseConnnection();
            }
            totalSalesTxtBox.Text = totalsales.ToString("#0.00");
            MessageBox.Show("SALES REPORT FINISHED!");
        }

我真的不知道我做错了什么,尤其是在 sql 字符串中,其中最后一个 INNER JOIN 应该将 stocksdb 表中的所有 stock_pricePerPiece 相加,其中股票在同一个菜单上使用,因此在recipedb 表中具有相同的menu_ID

我在dr = cmd.ExecuteReader(); 收到错误

【问题讨论】:

  • 你能调试并告诉我们你在哪一行得到错误吗?
  • 哪一行给出了错误..?如果 info[1] = (dr["order_ID"].ToString());,那么这意味着您需要从 0 开始索引,最后一个将是 19
  • 请看我的编辑先生 :)
  • info[0] 中有什么内容?数组是基于零索引的!
  • @DJKRAZE OP 的数组大小为 20,因此最后一个将是 19 而不是 5

标签: c# mysql sql indexing


【解决方案1】:

我意识到这个问题的答案并不容易解释,但它与我试图通过命令字符串虚拟重新创建的列有关。我所做的以及解决问题的方法是将要检索的特定列放在SELECT 查询中。

工作代码:

 private void goDateBtn_Click(object sender, EventArgs e)
        {
            reportList.Items.Clear();
            var db = new DBConnect();
            MySqlCommand cmd = null;
            MySqlDataReader dr = null;
            double totalsales = 0;
            try
            {
                if (db.OpenConnection() == true)
                {

                    string cmdstr = "SELECT DISTINCT ol.*, o.order_ID, o.order_date, o.order_status, m.*, mc.menu_cost " +
                                    "FROM  orderlist ol " +
                                        "INNER JOIN orderdb    o ON ol.order_ID = o.order_ID " +
                                        "INNER JOIN menudb     m ON ol.menu_ID  = m.menu_ID " +
                                        "INNER JOIN " +
                                            "(SELECT SUM(s.stock_pricePerPiece * r.recipe_quantity) AS menu_cost, m.menu_ID " +
                                                "FROM recipelist r " +
                                                    "INNER JOIN stocksdb s ON r.stock_ID = s.stock_ID " +
                                                    "INNER JOIN menudb m ON r.menu_ID= m.menu_ID " +
                                                "GROUP BY r.menu_ID " +
                                             ")" +
                                        "mc ON m.menu_ID = mc.menu_ID " +
                                    "WHERE o.order_date >= '" + fromDate.Value.Date.ToString("yyyy-MM-dd") + " 00:00:00" + "' AND " +
                                        "o.order_date <= '" + toDate.Value.Date.ToString("yyyy-MM-dd") + " 23:59:59" + "' AND " +
                                        "o.order_status = 'COMPLETED'";

                    if (menuCheckBox.Checked == true)
                    {
                        cmdstr = cmdstr + " AND m.menu_name = '" + menuBox.Text + "'";
                    }

                    cmd = new MySqlCommand(cmdstr, db.mycon);
                    dr = cmd.ExecuteReader();

                    string[] info = new string[20];
                    while (dr.Read())
                    {
                        info[1] = (dr["order_ID"].ToString());
                        info[2] = (dr["order_date"].ToString());
                        info[3] = (dr["menu_name"].ToString());
                        info[4] = (dr["order_quantity"].ToString());
                        info[5] = Convert.ToDouble(dr["menu_cost"].ToString()).ToString("#0.00");
                        info[6] = Convert.ToDouble(dr["menu_price"].ToString()).ToString("#0.00");
                        info[7] = ((Convert.ToDouble(dr["menu_price"].ToString()) * Convert.ToDouble(info[4])) - (Convert.ToDouble(dr["menu_cost"].ToString()) * Convert.ToDouble(info[4]))).ToString("#0.00");
                        this.reportList.Items.Add(new ListViewItem(new string[] { info[1], info[2], info[3], info[4], info[5], info[6], info[7] }));

                        totalsales += Convert.ToDouble(info[7]);
                    }
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (dr != null)
                {
                    dr.Close();
                }
                db.CloseConnnection();
            }
            totalSalesTxtBox.Text = totalsales.ToString("#0.00");
            MessageBox.Show("SALES REPORT FINISHED!");
        }

【讨论】:

    【解决方案2】:

    根据您对问题的编辑,指出哪一行产生了错误,完全颠覆了我之前的回答。

    如果您执行以下操作会发生什么?它可能有助于诊断您的查询语法:

    Console.WriteLine(cmdstr);
    

    我注意到的一件事是,这里的括号后面需要一个空格:

    "GROUP BY stock_ID )"+
    

    我不认为会影响查询,但可能值得一试。除此之外,我建议复制上面生成的查询并将其手动粘贴到您最喜欢的 SQL 应用程序中,并确保其语法正确。

    【讨论】:

    • 我确实有 6 列
    • 在添加和数组方面不应该是基于零的吗?我敢打赌它会在 info[6] 处引发错误,基于 C# 的索引为零
    • 不,我怀疑这是问题所在。在他编辑了上面的帖子之后,看起来他在将项目添加到 ListView 之前已经在 ExecuteReader() 行上得到了它。
    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 2022-01-20
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-04
    相关资源
    最近更新 更多