2012-10-26 66 views
0

我打開Northwind數據庫中的一個數據庫查詢,以查看我的ShoppingCart包含的每個項目。從Products表中取出ProductIDUnitsInStock。從數據庫中取出兩列以將數據保存到DataTabel ds之後。然後比較以確保用戶輸入的數量小於數據庫中的庫存欄數量。爲什麼我在DataSet上得到一個NullReferenceException?

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

行或列最有可能爲空。在if語句之前檢查ds。這樣的事情會發生的一個常見原因是Products表沒有返回任何內容。您無法獲取不存在的對象的屬性,因此是異常。您應該執行!= null比較而不是檢查計數。如果長度爲零,循環內的代碼將永遠不會執行,但不會崩潰或任何事情。

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

剛擡起頭,這將導致沒有問題,如果你的行數是零,但是你可能需要在循環中的一些邏輯來檢查你打算訪問的列存在。

+0

你的權利,它是空的 – GivenPie

+0

我會用適當的if語句編輯。 – evanmcdonnal

+0

我之前沒有運行它,因爲我關閉了數據庫,然後運行if語句。現在,我可以在將它放入'try'塊後運行我的if語句 – GivenPie

0

DataTableCollection.Item如果沒有包含指定表名的表,則返回null。

如果某個命令沒有返回任何行,則不會向DataSet添加任何表,也不會引發異常。所以我假設DataSet中沒有表,因爲沒有行被返回。

我會手動初始化一個DatatTable,並使用Fill的超載,其中需要DataTable

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

您正在嘗試與其硬編碼名稱獲取從數據集表,以你在數據庫中看到,我只是跑了一個類似的模式的測試,它看起來當你創建一個Dataset和填補像它與數據庫一樣,表名不會從數據庫中複製。正如蒂姆建議,你應該檢查ds.Table[0]

相關問題