Как решить ошибку «Index was outisde the bound of the array»?

Здравствуйте, я использую этот код, чтобы получить нужные мне данные из 5 разных таблиц в базе данных MySQL.

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 должен добавить все stock_pricePerPiece из stockdb , в котором запасы используются в одном и том же меню, следовательно, имеют тот же menu_ID в таблице recipedb .

I am getting the error on dr = cmd.ExecuteReader();

3
nl ja de
Что произойдет, если вы выполните этот запрос в MySql Workbench? Это работает? Можете ли вы попытаться создать представление и запросить это напрямую и посмотреть, не получится ли у вас такая же ошибка?
добавлено автор theMayer, источник
@DJKRAZE OP имеет массив размером 20, поэтому последний будет 19 , а не 5
добавлено автор Abubakkar, источник
что в информации [0]? массивы основаны на нулевом индексе!
добавлено автор Wim Ombelets, источник
что такое MySqlCommand? ................ И проверьте (попробуйте выполнить) запрос в SQL
добавлено автор andy, источник
Можете ли вы отлаживать и сообщать нам, на какой строке вы получаете ошибку?
добавлено автор ryadavilli, источник
какая строка дает ошибку ..? if info [1] = (dr ["order_ID"]. ToString ()); тогда это означает, что вам нужно запустить свой индекс в 0, а последний будет равен 19
добавлено автор MethodMan, источник
что означает cmd = new MySqlCommand (cmdstr, db.mycon); как вы можете вставить полный метод, где этот код ...? также оберните свой cmd.ExecuteReader() вокруг попытки поймать, где и как объявляется dr ..?
добавлено автор MethodMan, источник
см. мой править сэр :)
добавлено автор John Ernest Guadalupe, источник

2 ответы

Я понял, что ответ на этот вопрос непросто объяснить, но он имеет какое-то отношение к столбцам, которые я пытаюсь воссоздать практически через командную строку. То, что я сделал, и что решила проблема, заключалось в том, чтобы указать конкретные столбцы в запросе 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 и убедиться, что он синтаксически корректен.

1
добавлено
не должно быть Zero, основанного на добавлении и массиве? Бьюсь об заклад, что это ошибка в информации [6] Индексы Zero основаны на C #
добавлено автор MethodMan, источник
Позвольте мне обновить страницу и проверить.
добавлено автор MethodMan, источник
Нет, я сомневаюсь, что это проблема. После того как он отредактировал свой пост выше, похоже, что он получает его в строке ExecuteReader (), прежде чем он добавит элементы в ListView.
добавлено автор King Skippus, источник
У меня действительно есть 6 столбцов
добавлено автор John Ernest Guadalupe, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)