Как исправить эту странную нулевую ошибку
У меня есть этот кусок кода:
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. Я начал понимать эту ошибку..