【问题标题】:LINQ Statement Not Updating Database?LINQ 语句不更新数据库?
【发布时间】:2010-07-15 21:25:07
【问题描述】:

我有以下代码:

        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?"

【问题讨论】:

  • 什么是后端服务器? SQL 服务器?甲骨文?
  • SQL Server 2008 在后端。

标签: asp.net sql vb.net linq-to-sql


【解决方案1】:

您使用For Each row In pullresidents 遍历所有获取的对象,但您从不修改row。所以没有可以发送回数据库的更改。

【讨论】:

  • 我如何告诉它把我要更改的 occupantnum 与该行的记录相关联?如果我这样做 row.occupantnum = j 它说该行是只读的?
  • 这是因为您使用Select p.dorm_building, p.dorm_room, p.occupantnum 对匿名类型执行投影。删除此投影以获取完整的实体(只需使用 Select p),它将是可更新的。
  • 使用 IQueryable.ToArray() 然后使用索引访问数组...然后你可以修改值
  • Dan 是对的,而不是 Select p.dorm_building, p.dorm_room, p.occupantnum _,只做 Select p
  • 丹尼尔 - 说真的,你是我的英雄!
【解决方案2】:

我认为你在这里做的太多了。

您只是想更改行,对吗?

试着做这个:

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

进入这个:

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

【讨论】:

    【解决方案3】:

    如果这是错误的,请原谅我 - 但是如果您要保存新创建的“webResident”对象,您不必将它们与上下文相关联吗?我看不到 dbHousing.SubmitChanges() 如何保存它不知道的 webResidents。

    【讨论】:

    • 查看我对丹尼尔上面回答的评论......我不明白如何将其与当前上下文相关联。
    【解决方案4】:

    Dave,您需要先将新的 webResident 对象插入表中,然后再提交更改。

    dbHousing.webResidents.InsertOnSubmit(webResident);

    【讨论】:

    • 谢谢雷夫。我实际上是在尝试更新已拉出的现有行对象 - 而不是添加新对象...我错过了什么?
    • 我觉得你在这里做的太多了。您只是想更改行,对吗?尝试这样做: Dim wResident As New webResident wResident.occupantnum = j dbHousing.SubmitChanges() j = j + 1 变成: row.occupantnum = j dbHousing.SubmitChanges() j = j + 1
    • 如果你想更新对象,那么你必须修改对象本身,而不是创建新对象 - 我想你想设置 row.occupantnum = .
    猜你喜欢
    • 2015-07-25
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多