2012-10-26 2 views
0

Я открываю запрос базы данных из базы данных Northwind для каждого элемента, связанного с моей покупкой. Он должен принять ProductID и UnitsInStock из таблицы Products. После того, как я выберу два столбца из базы данных, чтобы сохранить данные в DataTabel ds. Затем я сравниваю, чтобы убедиться, что введенное количество введено меньше, чем единицы столбца в запасе в базе данных.Почему я получаю исключение NullReferenceException в DataSet?

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


      } 
     } 

ответ

3

Строки или столбцы, скорее всего, null. Осмотрите ds до этого оператора if. Общей причиной может быть то, что таблица Products ничего не возвращает. Вы не можете получить свойство объекта, которого не существует, и это исключение. Вы должны сделать сравнение != null вместо проверки счета. Если длина равна нулю, код внутри цикла никогда не будет выполняться, но вы не будете терпеть крах или что-то еще.

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

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

+0

Справа от него находится нуль – GivenPie

+0

. Я поставлю редактирование с помощью правильного оператора if. – evanmcdonnal

+0

Я не запускал его раньше, потому что я закрыл свою базу данных, а затем выполнил оператор if. Теперь я могу запустить мой оператор if после того, как поместил его в блок 'try'. – GivenPie

0

DataTableCollection.Item возвращает null, если нет таблицы с указанным именем таблицы.

Если команда не возвращает никаких строк, в DataSet не добавляются таблицы, и исключение не создается. Поэтому я предполагаю, что в DataSet нет таблицы, потому что строки не возвращаются.

Вместо этого я бы инициализировал сингл DatatTable и использовал перегрузку Fill, которая принимает DataTable.

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

Вы пытаетесь получить таблицу из набора данных с закодированным именем, что вы видите в базе данных, я просто провел тест на аналогичную схему, и это выглядит, когда вы создаете Dataset и заполнить из базы данных, как вы это делаете, имя таблицы не копируется из базы данных. Как предложил Тим, вы должны проверить на наличие ds.Table[0]