2010-07-15 57 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