为什么我在DataSet上得到NullReferenceException?

时间:2012-10-26 21:21:37

标签: c# asp.net database dataset icollection

我正在Northwind数据库中为我的ShoppingCart所需的每个项目打开一个数据库查询。从ProductID表中取出UnitsInStockProducts。从数据库中取出两列后,将数据保存到DataTabel ds。然后我进行比较以确保用户输入的数量小于数据库中库存的列单位。

theCart.Values是ICollections的一部分。

我是gettign错误:从我的异常消息:“连接到数据库时出现问题:对象引用未设置为对象的实例。”

这是代码。

DataSet ds = new DataSet();
        OleDbConnection conn = new OleDbConnection((string)Application["DBConnectionString"]);
        foreach (OrderItem item in theCart.Values)
        {
            string selectionString =
            "SELECT Products.ProductID, Products.UnitsInStock " +
                "FROM Products" +
                "WHERE Products.ProductID = " + item.ProductID + ";";
            try
            {
                OleDbCommand cm = new OleDbCommand(selectionString, conn);
                OleDbDataAdapter da = new OleDbDataAdapter();
                da.SelectCommand = cm;
                da.Fill(ds);
                da.Dispose();
                 if (ds.Tables["Products"].Columns.Count != 0 &&
            ds.Tables["Products"].Rows.Count != 0)
            {
                for (int index = 0; index < ds.Tables["Products"].Rows.Count; index++)
                {
                    if (item.ProductID == int.Parse(ds.Tables["Products"].Rows[index][indexOfProductID].ToString()))
                    {
                        if (item.QuantityOrdered > int.Parse(ds.Tables["Products"].Rows[index][indexOfUnitsInStock].ToString()))
                        {
                            hasStock = false;
                            int inStock = int.Parse(ds.Tables["Products"].Rows[index][indexOfUnitsInStock].ToString());
                            txtUnderstockedItems.Text += "Sorry we do not have enough stock of item: " + item.ProductName +
                                "<br> Currently, " + item.ProductName + " (ID:" + item.ProductID + ") has " + inStock + " in stock.";
                        }
                        else
                        {//can output how many items in stock here. 
                            hasStock = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                txtUnderstockedItems.Text = "There was a problem connecting to the database: " + ex.Message;
            }
            finally
            {

                conn.Close();
            }


            }
        }

3 个答案:

答案 0 :(得分:3)

行或列很可能为null。在if语句之前检查ds。出现这种情况的常见原因是Products表没有返回任何内容。您无法获取不存在的对象的属性,因此异常。您应该进行!= null比较,而不是检查计数。如果长度为零,则循环内的代码将永远不会执行,但您不会崩溃或任何事情。

if (ds.Tables["Products"].Columns != null && ds.Tables["Products"].Rows != null)

如果您的行数为零,这将不会引起任何问题,但您可能需要在循环中使用某些逻辑来检查您计划访问的列是否存在。

答案 1 :(得分:0)

如果没有包含指定table-name的表,

DataTableCollection.Item将返回null。

如果命令没有返回任何行,则不会向DataSet添加任何表,也不会引发异常。所以我假设DataSet中没有表,因为没有返回任何行。

我会手动初始化一个DatatTable,并使用Fill的重载,其中DataTable

Dim table = new DataTable("Products")
da.Fill(table)

答案 2 :(得分:0)

您正试图从数据集中获取具有硬编码名称的表格,以及您在数据库中看到的内容,我只是在类似模式上运行测试,看起来就像您创建Dataset并填写时一样它正如您在数据库中那样,不会从数据库中复制表名。正如蒂姆建议的那样,你应该检查ds.Table[0]