2010-07-15 56 views
0

我有以下代碼:LINQ聲明不更新數據庫?

 Dim dbHousing As New dcHousingDataContext 
    Dim pullresidents = From p In dbHousing.webResidents _ 
       Select p.dorm_building, p.dorm_room, p.occupantnum _ 
       Order By dorm_building, dorm_room 
    Dim j as integer = 1 
    Dim previous As String = "" 
    For Each row In pullresidents 
     If previous = "" Then 
      Dim wResident As New webResident 
      wResident.occupantnum = j 
      dbHousing.SubmitChanges() 
      j = j + 1 
      previous = row.dorm_building & " " & row.dorm_room 
     Else 
      If previous = row.dorm_building & " " & row.dorm_room Then 
       Dim wResident As New webResident 
       wResident.occupantnum = j 
       dbHousing.SubmitChanges() 
       j = j + 1 
      Else 
       Dim wResident As New webResident 
       j = 1 
       wResident.occupantnum = j 
       dbHousing.SubmitChanges() 
       j = j + 1 
       previous = row.dorm_building & " " & row.dorm_room 
      End If 
     End If 

    Next 

當我運行它,看着調試都沒有問題,但是當我檢查數據庫表中它應該被插入 - 列值(occupantnum)避風港沒有改變 - 他們都是空的!

不確定這是否相關,但請注意,我現在已經更新j顯式爲整數。我在調試時注意到wResident.occupantnum顯示爲Type「Integer?」 - 但這似乎沒有什麼區別 - 當我重新運行它時,它仍然表示類型「整數」?

+1

什麼是後端服務器? SQL Server?甲骨文? – 2010-07-15 21:26:52

+0

SQL Server 2008在後端。 – davemackey 2010-07-15 21:27:49

回答

2

您使用For Each row In pullresidents迭代所有提取的對象,但不會修改row。所以沒有可能發回到數據庫的更改。

+0

如何告訴它將我試圖改變的佔用者與該行的記錄相關聯?如果我做row.occupantnum = j它說這行是隻讀的? – davemackey 2010-07-15 21:35:23

+2

這是因爲您使用'選擇p.dorm_building,p.dorm_room,p.occupantnum'來執行anonymouse類型的投影。刪除這個投影來獲取完整的實體(只需使用'Select p'),它就可以更新。 – 2010-07-15 21:41:32

+0

使用IQueryable .ToArray()然後使用索引訪問數組...然後您可以修改值 – raisyn 2010-07-15 21:43:25

1

請原諒我,如果這是錯誤的 - 但你不必將新創建的「webResident」對象與上下文關聯,如果你要保存它們嗎?我看不到dbHousing.SubmitChanges()如何保存它不知道的webResidents。

+0

請參閱我對丹尼爾上面的答案的評論......我不理解如何將它與當前上下文相關聯。 – davemackey 2010-07-15 21:35:58

1

Dave,在提交更改之前,您需要先將新的webResident對象插入表中。

dbHousing.webResidents.InsertOnSubmit(webResident);

+0

謝謝Rafe。我實際上試圖更新現有的行對象 - 我沒有添加新的對象...我錯過了什麼? – davemackey 2010-07-15 21:38:35

+1

我覺得你在這裏做得太多了。你只是想改變這一行,對嗎? 嘗試使這一點: 昏暗wResident作爲新webResident wResident.occupantnum = j的 dbHousing.SubmitChanges() 當J = J + 1 成這樣: 行。occupantnum = j dbHousing.SubmitChanges() j = j + 1 – Rafe 2010-07-15 21:41:41

+0

如果你想更新對象,那麼你必須修改對象本身,而不是創建新對象 - 我想你想設置row.occupantnum = 。 – 2010-07-15 21:42:31

2

我想你在這裏做得太多了。

你只是想改變這一行,對嗎?

嘗試製作這樣的:

Dim wResident As New webResident 
wResident.occupantnum = j 
dbHousing.SubmitChanges() 
j = j + 1 

到這一點:

row.occupantnum = j 
dbHousing.SubmitChanges() 
j = j + 1