Noetico Ответов: 1

Как исправить эту странную нулевую ошибку


У меня есть этот кусок кода:

 string getOrder = "SELECT * FROM `wpet_woocommerce_order_items` a LEFT JOIN `wpet_woocommerce_order_itemmeta` b ON a.order_item_id = b.order_item_id LEFT JOIN `wpet_users` f ON f.ID = b.meta_value AND b.meta_key = 'seller_id' LEFT JOIN `wpet_dokan_orders` c  ON a.order_id = c.order_id LEFT JOIN `wpet_posts` d ON a.order_id = d.ID   WHERE a.order_id =" + cx.Field<ulong>("ID")  + " AND a.order_item_type = 'line_item' AND d.post_status = 'wc-completed';";
                    conn.Open();
                    MySqlCommand cmd = new MySqlCommand(getOrder, conn);

                    status.Text = conn.State.ToString();
                    // conn.Open();
                    MySqlDataAdapter dt = new MySqlDataAdapter(cmd);

                    DataTable wcOrder_data = new DataTable();
                    dt.Fill(wcOrder_data);

                    GridView3.DataSource = wcOrder_data;
                    GridView3.DataBind();

                    var toListing = wcOrder_data.Select().ToList();
                    // var reform = wcOrder_data.AsEnumerable();
                    conn.Close();

//ERROR POINT -->
                    var getUniqueItems = wcOrder_data.AsEnumerable().Where(x => x.Field<ulong>("order_item_id") > 0).GroupBy(x => x.Field<ulong>("order_item_id")).Select(g => new
                    {
                        ItemID = g.Key.ToString(),
                        ItemName = g.Select(x => x.Field<string>("order_item_name")).FirstOrDefault(),
                        Order = g.Select(x => x.Field<UInt64>("order_id").ToString()).FirstOrDefault(),
                        Vendor = g.Select(x => x.Field<Int64>("seller_id")).FirstOrDefault().ToString(),
                        ItemAmount = g.Where(x => x.Field<string>("meta_key") == "_line_subtotal").Select(x => x.Field<string>("meta_value").ToString()).FirstOrDefault(),
                        ItemLineTotal = g.Where(x => x.Field<string>("meta_key") == "_line_total").Select(x => x.Field<string>("meta_value").ToString()).FirstOrDefault(),

                        Commission = g.Where(x => x.Field<string>("meta_key") == "_dokan_commission_rate").Select(x => x.Field<string>("meta_value").ToString()).FirstOrDefault(),
                        Qty = g.Where(x => x.Field<string>("meta_key") == "_qty").Select(x => x.Field<string>("meta_value").ToString()).FirstOrDefault(),
                        CommissionToMall = double.Parse(g.Where(x => x.Field<string>("meta_key") == "_line_subtotal").Select(x => x.Field<string>("meta_value")).FirstOrDefault()) * (double.Parse(g.Where(x => x.Field<string>("meta_key") == "_dokan_commission_rate").Select(x => x.Field<string>("meta_value")).FirstOrDefault()) / 100),
                        OrderDate = g.Select(x => x.Field<DateTime>("post_date")).FirstOrDefault(),
                        SellerEmail = g.Select(x => x.Field<string>("user_email")).FirstOrDefault(),
                        VendorName = g.Select(x => x.Field<string>("display_name")).FirstOrDefault(),




                    });


Который возвращает нулевую ссылочную ошибку, я действительно озадачен этим, потому что gridview в этом коде возвращает данные, я не знаю, почему у меня есть эта ошибка:

ERROR: Value cannot be null. Parameter name: value::::::mscorlib::: at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt) at System.Double.Parse(String s) at App.tester.<>c.b__2_2(IGrouping`2 g) in C:\Users\Kent\Documents\Visual Studio 2015\Projects\App\tester.aspx.cs:line 60 at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at App.tester.Button1_Click(Object sender, EventArgs e) in C:\Users\Kent\Documents\Visual Studio 2015\Projects\App\tester.aspx.cs:line 84


Что я уже пробовал:

Я пробовал все виды исправлений, получая данные в список, но он продолжает возвращать нулевую ссылку. Ошибку тоже не до конца понимаю. Пожалуйста, пусть кто-нибудь поможет мне с этим. Спасибо.

Jin Vincent Necesario

Я думаю, что проблема заключается в этой строке: CommissionToMall = double.Синтаксический анализ(г. Где(Х => У Х.Поле в<строка> У("meta_key") == "_line_subtotal").Выберите(x => x.Field<string>("meta_value")).Метода firstordefault()) * (двойной.Синтаксический анализ(г. Где(Х => У Х.Поле в<строка> У("meta_key") == "_dokan_commission_rate").Выберите(x => x.Field<string>("meta_value")).FirstOrDefault()) / 100).

F-ES Sitecore

Разбейте эту строку на отдельные утверждения, это значительно облегчит точное определение того, какой бит имеет проблему. Один из ваших операторов "Where", вероятно, возвращает нулевое значение.

Noetico

Да будет сделано, большое вам спасибо

Noetico

Спасибо! Займись этим прямо сейчас!

Noetico

Вы попали в точку, сэр! Я закомментировал эти строки, и сценарий двинулся дальше, обновит поток. Спасибо.

Noetico

Я сделал следующее, чтобы проверить null, у меня все еще есть проблема, это хорошая проверка?:

CommissionToMall = g.Where(x=>x.Field<string>("meta_key") == "_dokan_commission_rate") == null? 0: (double.Parse(g.Where(x => x.Field<string>("meta_key") == "_line_subtotal").Select(x => x.Field<string>("meta_value")).FirstOrDefault())) * (double.Parse(g.Where(x => x.Field<string>("meta_key") == "_dokan_commission_rate").Select(x => x.Field<string>("meta_value")).FirstOrDefault()) / 100),

Noetico

Спасибо, в конечном счете это была проблема, я полностью пропустил это поле, так как оно было фактически нулевым для некоторых заказов на проверку данных, я также использовал nullable типы и использовал good 'ol if оператор для проверки пустых строк, так как именно поэтому мое двойное приведение было неудачным. Спасибо.

Richard Deeming

string getOrder = "SELECT * FROM ... WHERE a.order_id =" + cx.Field<ulong>("ID") + " AND ...";

Не делай этого так!

В то время как в данном конкретном случае возможно, вы и правы, но использование конкатенации строк для построения SQL-запроса неизменно приводит к тому, что SQL-инъекция[^] факторы уязвимости.

НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.

Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]

Noetico

Спасибо, я обновил в соответствии с вашим советом параметризованный запрос. Кроме того, строка, на которую вы ссылаетесь, работает нормально, этот код работал до тех пор, пока я не получил обратную связь о том, что данные снова не синхронизируются с woocommerce. Я начал понимать эту ошибку..

1 Ответов

Рейтинг:
1

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-одно или несколько значений равно нулю. В вашем gridview могут быть и другие данные, но что - то является нулевым- и мы не можем сказать, что именно, потому что у нас нет никакого доступа к вашим данным!

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Имейте в виду, что это не будет быстрой работой: вам придется очень внимательно изучить ваши данные, чтобы узнать, где именно находится null - а затем начать работать в обратном направлении, чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Noetico

Ах да, тут начинается самое смешное, есть еще одна ошибка с системой.EnterprisesServices dll на компьютере, я гонялся за этим и заменил все DLL на хорошие, никакого решения, у меня нет отладчика, visual studio в настоящее время страдает от ошибок, я бы переустановил все, но нужно решить эту проблему, так как ее время поджимает. Нет проблем, спасибо.

OriginalGriff

Вы не сможете исправить это без VS: либо для запуска отладчика, либо для компиляции вашего приложения снова и снова.

Существует два способа отладки приложения: использование отладчика или добавление операторов трассировки. Последнее, безусловно, самый медленный путь, но это тот, с которого мы начали, и он все еще эффективен.
Начните добавлять операторы трассировки для регистрации того, что находится в ваших данных, и того, что будет сделано с ними. Затем добавьте еще, чтобы показать, что с ним произошло. Это будет означать разбиение вашего кода на отдельные строки и мониторинг каждой из них.
Затем уточните ведение журнала, чтобы показать более подробную информацию об ошибках. и повторяйте, и повторяйте, пока не поймете, в чем проблема и почему.

Я бы почистил и переустановил себя - это, вероятно, будет быстрее!

Noetico

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