从其他表访问列时获取 Null 引用异常

Getting Null Reference Exception while accessing columns from other tables

提问人:Student 提问时间:10/7/2019 更新时间:10/7/2019 访问量:237

问:

我正在尝试在 NWTraders 数据库的产品上使用 Linq 在 c# 中执行 CRUD 操作。在添加新产品时,我尝试显示“供应商名称”和“类别名称”,而不是“供应商 ID”和“类别 ID”(它们是“产品”表的外键)。

我尝试添加新产品,但在我按 OK 将其保存到数据库并更新我的数据网格后不久它就崩溃了。但是我注意到新产品正在更新到数据库中,供应商和类别 ID 为 Null,这进一步阻止了我访问产品 Windows 窗体本身,因为它无法检索我在 ADD 期间提供给新产品的相应供应商和类别名称的 ID。

cmbSupplierName.SelectedIndex 似乎收到 NULL 值,并且 this.product.Supplier.Company 抛出 Null 引用异常。类别的问题也是如此。如果我使用 if 条件处理它们,那么它仍然会在下面的代码中抛出异常。

private void LoadProductInformation()
        {


            lblProductHeader.Text = "Information about :" + this.product.ProductName;
            txtProductID.Text = this.product.ProductID.ToString();
            txtProductName.Text = this.product.ProductName;
// Not loading for Add Products as User has to enter the values.
            if (this.Mode != ProductViewMode.Add)
            {
                cmbSupplierName.SelectedIndex = cmbSupplierName.FindString(this.product.Supplier.CompanyName);
                cmbCategory.SelectedIndex = cmbCategory.FindString(this.product.Category.CategoryName);


                txtQuantityPerUnit.Text = this.product.QuantityPerUnit;
                txtUnitPrice.Text = this.product.UnitPrice.Value.ToString("C");

                txtUnitsInStock.Text = this.product.UnitsInStock.Value.ToString();
                txtUnitsOnOrder.Text = this.product.UnitsOnOrder.Value.ToString();
                txtReorderLevel.Text = this.product.ReorderLevel.Value.ToString();


                chkDiscontinued.Checked = (this.product.Discontinued == true);
            }

        }

public void LoadDGVProducts(IEnumerable<Product> products)
        {
            // If there are no products, do nothing and return from the function.
            if (products == null) return;
            FetchData(); //fetching all the serach parameters 

            this.dgvProducts.SelectionChanged -= new System.EventHandler(this.DGVProducts_SelectionChanged);


            if (dgvProducts.RowCount == 0)
                FormatDGVProducts();

            dgvProducts.Rows.Clear();

            // Go through every product in the product collection and 
            // add it as a row in the dgv

                foreach (Product prod in products)
                {
                    dgvProducts.Rows.Add(
                        prod.ProductID, // The ID will not actually be shown since it is given to a column that has the Visible property set to False.
                        prod.ProductName,
                        prod.Supplier.CompanyName,
                        prod.Category.CategoryName,
                        prod.QuantityPerUnit,
                        prod.UnitPrice.Value.ToString("C"),
                        prod.UnitsInStock,
                        prod.UnitsOnOrder,
                        prod.ReorderLevel,
                        prod.Discontinued
                        );
                ...........................
            }
        }

由于供应商和类别 ID 在数据库上收到 Null 值,它在“foreach”处向我抛出异常,因为即使在这种情况下有一个值为 null,它也不会让产品显示在数据网格上。

我不知道我应该在哪里将供应商 ID 连接到名称,以便它不会在数据库上接收 Null 值。

C# LINQ 实体框架-6 NullReferenceException

评论

0赞 fredrik 10/7/2019
不从数据库接收 null 值的唯一方法是数据库中没有 null 值。代码中需要 null 守卫。
2赞 Fildor 10/7/2019
什么是 NullReferenceException 的可能重复,我该如何修复它?

答: 暂无答案