代码之家  ›  专栏  ›  技术社区  ›  Greg

在简单语句中找不到行或更改了行

  •  18
  • Greg  · 技术社区  · 14 年前

    我得到的不是很好的解释 Row not found or changed 执行db.SubmitChanges()时引发错误。如果在SubmitChanges()发生之前中断执行,则可以签入SQL Server Management Studio和行 存在!

    下面是整个函数的代码,只是为了将它放在任何想要帮助的人的上下文中,但是问题行就在最后(第48行)。

    这是一个非常奇怪的错误:错误是由更新matchingTrans.Url引起的(请参阅倒数第二行代码)。注释掉这一行不会抛出错误-即使matchingTrans.Title仍然得到更新。

    private static void MenuItemUpdate(int languageId, NavigationItem item)
    {
        using (var db = DataContextFactory.Create<MyDataContext>())
        {
            // Select existing menu item from database.
            var dbItem =
                (from i in db.MenuItems
                 where i.Id == item.Id
                 select i).Single();
            // Obtain ID of link type.
            dbItem.FkLinkTypeId = GetLinkTypeByName(
                Enum.GetName(typeof (NavigationItemLinkType), item.LinkType)).Id;
            // Update the Link field with what is given.
            dbItem.Link = item.Link;
            db.SubmitChanges();
    
            // Item already exists and needs editing.
            // Get associated translations.
            var trans =
                from t in db.MenuItemTranslations
                where t.FkMenuItemId == item.Id
                select t;
    
            // If translation exists for given language, edit it.
            var matchingTrans =
                (from t in trans
                 where t.FkLanguageId == languageId
                 select t).SingleOrDefault();
    
            if (matchingTrans == null)
            {
                // No matching translation - add one.
                var newDbTrans = new MenuItemTranslation
                {
                    FkMenuItemId = item.Id,
                    FkLanguageId = languageId,
                    Title = item.Title,
                    Url = item.FriendlyUrl
                };
                db.MenuItemTranslations.InsertOnSubmit(newDbTrans);
                db.SubmitChanges();
            }
            else
            {
                // Matching translation - edit it.
                matchingTrans.Title = item.Title;
                matchingTrans.Url = item.FriendlyUrl;
                db.SubmitChanges();
                // WTF ERROR: Row not found or changed.
            }
        }
    }
    
    4 回复  |  直到 9 年前
        1
  •  49
  •   Greg    14 年前

    通过查看SQL Profiler输出,它帮助我找到了这个问题的答案。生成了一段不好的SQL,结果是 WHERE 0 = 1

    结果发现,该字段只是被另一个开发人员更改为允许空值,而Linq to SQL文件并没有相应地更新。

    简而言之,如果 Row not found or changed 似乎无原因生成了错误消息,

        2
  •  3
  •   jdhurst    11 年前

    查看sql server服务器级别的连接属性“No Count”


    2。转到“连接”选项卡/页
    三。查找默认连接选项“no count”
    四。确保未选中此选项。

        3
  •  2
  •   Jeremy Harning    10 年前

    另一个可能的答案是:

    示例:您有一个允许用户将图像上载到数据库的网站。您的表中有一个blob(在sql server中的映像,随便什么)不可为空。用户选择用已经存在的完全相同的图像更新记录。更新检查将失败。我通过先做一个.StimeRealSalk()检查,然后在传入的字节数组不等于现有的字节数组的情况下在上下文对象上调用SuffMechange()来修复这个问题。

        4
  •  1
  •   William Casarin    13 年前

    即使数据库模式和dbml完全匹配,我也会遇到这个问题。问题是我试图更改一个实体并在一个SubmitChanges语句中插入实体。我通过对每个操作执行submitchange而不是同时执行所有操作来修复它。

    这都在事务范围内,所以可能与此有关,但我不确定。