首页 / 知识
关于.net:如何解决LINQ to SQL Server Compact Edition数据库上的SQL中的“找不到或更改行”异常?
2023-04-14 06:45:00

What can I do to resolve a “Row not found or changed” Exception in LINQ to SQL on a SQL Server Compact Edition Database?在使用LINQ to SQL连接更新了几个属性(针对SQL Server Compact Edition)后,对DataContext执行SubmitChanges时,出现"未找到或更改行"。 ChangeConflictException。
该查询生成以下SQL:
明显的问题是WHERE 0 = 1,加载记录后,我已经确认" deviceSessionRecord"中的所有属性都正确,可以包含主键。同样,在捕获" ChangeConflictException"时,没有有关此失败原因的其他信息。我还确认了该异常与数据库中的一条记录(我正在尝试更新的记录)一起引发 奇怪的是,我在代码的不同部分中有一个非常相似的update语句,它生成以下SQL,并且确实更新了SQL Server Compact Edition数据库。
我已经确认在数据库模式和生成LINQ类的DBML中都已经标识了正确的主字段值。 我猜这几乎是一个两部分的问题: 在过去的两个小时中,我一直在与这个问题作斗争,因此我们将不胜感激。 那很讨厌,但是很简单:
检查O / R-Designer中所有字段的数据类型是否与SQL表中的数据类型匹配。 例如,NVARCHAR列" title"在您的数据库中被标记为NULLable,并且包含值NULL。即使在O / R映射中将该列标记为"不可为空",LINQ也会成功加载它并将column-String设置为null。
当字段的数据类型与SQL中的数据类型不匹配时,或者如果缺少字段,则会出现相同的症状,因为LINQ无法确保自读取数据以来SQL数据没有更改。 首先,了解导致问题的原因很有用。谷歌搜索解决方案应该有所帮助,您可以记录有关冲突的详细信息(表,列,旧值,新值),以找到更好的解决方案,以便以后解决冲突:
创建用于包装您的sumbitChanges的帮助器:
然后调用提交更改代码:
最后,将异常记录在全局异常处理程序中:
在DataContext上有一个称为Refresh的方法,可能在这里有所帮助。它使您可以在提交更改之前重新加载数据库记录,并提供不同的模式来确定要保留的值。就我而言," KeepChanges"似乎是最聪明的,它旨在将我的更改与同时发生在数据库中的任何无冲突的更改合并。 如果我正确理解。 :) 这也可能是由于使用多个DbContext引起的。 因此,例如:
这段代码有时会以无法预料的方式失败,因为在两种情况下都使用用户,将用户更改并保存在一个上下文中,然后在另一个上下文中保存。拥有"某些东西"的用户的内存中表示形式与数据库中的内容不匹配,因此您会遇到此潜在的错误。 防止这种情况的一种方法是编写任何可能被称为库方法的代码,使其采用可选的DbContext:
因此,现在您的方法采用一个可选数据库,如果没有,则自行创建一个数据库。如果存在,则仅重用传入的内容。helper方法使在整个应用程序中重用此模式变得容易。 我通过将表从服务器资源管理器重新拖到设计器并重新构建来解决了此错误。 这是您需要在C#代码上覆盖此错误的内容:
我通过在所有 不过,这感觉并不适合。就我而言,这似乎与以下事实有关:该表与从中删除行的另一个表相关联。 这是在Windows Phone 7.5上。 我不知道您是否对您的问题找到满意的答案,但我也发布了类似的问题,并最终自己回答了。事实证明,数据库的NOCOUNT默认连接选项已打开,这对Linq对Sql所做的每次更新都会导致ChangeConflictException。您可以在这里参考我的帖子。 在使用qub1n的答案后,我发现对我来说问题是我无意中将数据库列声明为十进制(18,0)。我正在分配一个十进制值,但是数据库正在更改它,剥离了十进制部分。这导致行更改问题。 如果其他人遇到类似问题,只需添加此内容即可。
就我而言,问题在于服务器范围的用户选项。 https://msdn.microsoft.com/zh-CN/library/ms190763.aspx 我启用了NOCOUNT选项,希望获得一些性能上的好处:
事实证明,这打破了Linq对"受影响的行"的检查(据我从.NET来源了解的最多),导致ChangeConflictException 重置选项以排除512位可解决此问题。 由于使用了两个不同的上下文,所以我也收到了此错误。我通过使用单个数据上下文解决了此问题。
我最近遇到了此错误,发现问题不在于我的数据上下文,而是在上下文上调用Commit之后在触发器内触发了更新语句。 我添加此答案仅是为了帮助其他人处理此错误,而没有在上面的答案中找到解决方案。 我知道这个问题早已得到解答,但在这里我花了最后几个小时将头撞在墙上,我只想分享我的解决方案,结果与该线程中的任何项目都不相关: 正在缓存! 我的数据对象的select()部分正在使用缓存。在更新对象时,出现了"找不到行或更改行"错误。 确实有几个答案提到使用不同的DataContext,并且回想起来这可能是正在发生的事情,但是它并没有立即使我想到缓存,因此希望这对某人有所帮助! |
最新内容
相关内容
linux数据库查找命令?
linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,在linux中如何用命令查找文件在哪使用查找命令 “find”命令允许linux数据库同步命令?
linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,DB2数据库在linux操作系统的指令有哪些?1、linux系统常用操作命令linux连接多条命令?
linux连接多条命令?,工具,情况,命令,分行,服务,地址,连续,终端,窗口,主机,linux怎么使多条命令同时执行基本上,您可以通过单一控制台窗口控制所linux有线网连接命令?
linux有线网连接命令?,系统,网络,软件,电脑,密码,地址,信息,虚拟机,终端,命令,linux系统下怎么连接网络1、启动Linux,然后在网络设置中将eth0设linux编译连接命令?
linux编译连接命令?,系统,代码,环境,工具,文件,资料,电脑,百度,终端,命令,在linux0.12系统中编译0.12内核时,使用什么命令1、linux的源码是在/linux建立数据库命令?
linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服务,linux中在shell中怎么创建一个数据库1、以下的文章主要讲述的是linux命令进数据库?
linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,主机,linux系统mysql数据库怎么进入数据库首先确保linux下mysql安linux上的软连接命令?
linux上的软连接命令?,系统,设备,位置,链接,文件,数据,交通,地方,信息,地址,Linux查看文件内容.创建.查看软硬链接命令示例命令1:查看文件内容mac命令连接linux?
mac命令连接linux?,系统,软件,电脑,密码,公司,网络,地址,通用,服务,发展,macbook苹果电脑系统如何使用“终端”远程登录linux主机?Windows远程远程连接命令linux?
远程连接命令linux?,服务,系统,密码,网络,软件,名称,电脑,资料,地址,信息,远程登录Linux服务器的命令是什么?1、若改变了端口号,则为:ssh登录名@linux数据库检查命令?
linux数据库检查命令?,服务,状态,地址,位置,系统,信息,命令,工作,情况,密码,在linux中,怎样查看Mysql服务运行状态?1、psaux或netstat-tlunppslinux命令进去数据库?
linux命令进去数据库?,地址,服务,名字,系统,数据库,工具,基础,工作,管理,网络,linux系统mysql数据库怎么进入数据库(linux进入mysql数据库命令