【问题标题】:Why am I getting a NullReferenceException on a DataSet?为什么我在 DataSet 上收到 NullReferenceException?
【发布时间】:2012-10-17 04:08:03
【问题描述】:

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

theCart.Values 是 ICollections 的一部分。

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

这是代码。

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();
            }


            }
        }

【问题讨论】:

    标签: c# asp.net database dataset icollection


    【解决方案1】:

    DataTableCollection.Item 如果没有具有指定表名的表,则返回 null。

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

    我会手动初始化单个DatatTable,并使用Fill 的重载,它采用DataTable

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

    【讨论】:

      【解决方案2】:

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

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

      请注意,如果您的行数为零,这不会导致任何问题,但您可能需要循环中的一些逻辑来检查您计划访问的列是否存在。

      【讨论】:

      • 我之前没有运行它,因为我关闭了我的数据库然后运行了 if 语句。现在我可以在将 if 语句放入 try 块后运行它
      • 将其包装在 try 中将防止该异常导致您的应用程序崩溃。但是,我建议使用 if/else 语句并明确处理每个不同的场景。
      • 我会尝试其他答案之一来解决新错误。 Rows 和 Columns 为空,因为您的 db io 有问题。您需要解决这个问题,但您还应该改进错误处理,因为对于依赖外部数据源的实际应用程序,您不能期望从中获取数据。
      【解决方案3】:

      您正在尝试从数据集中获取具有硬编码名称的表,以了解您在数据库中看到的内容,我刚刚对类似模式进行了测试,看起来就像您创建 Dataset 并填充它正如您所做的那样,表名不是从数据库中复制的。正如蒂姆建议的那样,您应该检查ds.Table[0]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 2012-05-11
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多