Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 综合其它

【案例分享】主键字段值含有不间断空格引发的问题;Error#-2147467259:Microsoft Access数据库引擎已停止该进程,因为您和其他用户正在尝试同时更改同一数据。的解决方法

时 间:2024-11-16 11:11:46
作 者:金宇   ID:43  城市:江阴
摘 要:主键字段值含有不间断空格引发的ODBC链接表中记录出现【#已删除的】提示。
正 文:

一、问题出现环境:

使用Access去链接SQL Server的ODBC链接表才会出现此问题

注:案例数据是重新模拟的


二、问题描述:

最近帮一个客户做数据批量更新,SQL Server的表中也就四千多条记录,先将Excel数据导入至Access临时表,然后用Access临时表跟SQL Server中的实际表进行关联更新,一更新就会出现下图的提示:

Error#-2147467259:Microsoft Access数据库引擎已停止该进程,因为您和其他用户正在尝试同时更改同一数据。


三、问题定位:


为了排查问题,分了两种测试方法:

1.先将SQL Server某表中原有的四千多条记录清空,自己模拟了2万条新记录,然后在Access中使用新记录主键编号测试关联更新完全没有问题。

2.SQL Server先保留原有的100条记录,测试更新没有问题,再保留原有的1000条记录,测试更新也没有问题,再将原有的四千多条记录全部放回表中,测试更新还是报错,初步推断问题应该出现在记录上,是哪些记录引起的问题呢?通过多次的测试终于找到了那条记录,在SQL Server中查看这条记录根本看不出任何问题,但在Access中的ODBC链接表关于条记录会出现如下图错误【#已删除的
点击图片查看大图

从SQL Server表中看这条记录好像也看不出什么问题,CustomerID是主键字段,也就看到这条记录主键字段的值中含有一个空格【JD-2020-018 V01】。


记得字段值含有一个空格在实际业务中也很正常啊(客户针对这张表的主键值是从Excel导入的),于是将这个主键字段的值拷贝到微软的Visual Studio Code软件中,结果发现空格出提示【The character U+00a0 is not a basic ASCll character】。

点击图片查看大图


通过AI工具Kimi搜索"U+00a0",获取了以下相关知识点:
U+00A0 是一个 Unicode 编码,它代表的字符是“非换行空格”(Non-Breaking Space),也称为“不间断空格”或“固定空格”。这个字符的特点是它是一个空格,但是它不会在文本中引起换行。
U+00A0(非换行空格,Non-Breaking Space)和普通的空格(U+0020,Space)在功能和用途上有一些区别:
换行行为:
非换行空格(U+00A0):与普通空格不同,非换行空格阻止了文本在该位置换行。这意味着即使文本达到了行尾,包含非换行空格的单词或短语也不会被分开到下一行,从而保持了文本的连贯性。

普通空格(U+0020):在文本中,普通空格是一个标准的空白字符,它允许文本在达到行尾时换行。也就是说,如果一个单词或短语中间有空格,文本编辑器或排版系统会在这些空格处断行,以便文本能够适应不同的宽度。


在记事本中重新手写一个相同的值【JD-2020-018 V01】,其中的空格使用普通空格,然后拷贝到ODBC链接表的新记录中,新产生的这条记录是正常的,整条记录没有出现【#已删除的】提示。


那确定问题就是主键字段值中含有不间断空格引起的。

同时又测试了一下在非主键字段中含有不间断空格是否也会让这条记录产生【#已删除的】提示,经测试记录是正常的,并没有出现错误提示。


四、解决方法:


1.如果主键字段的值是从Excel导入的,那可以先在Excel中针对主键字段的值先使用普通空格替换掉不间断空格,可以使用函数 

SUBSTITUTE,=SUBSTITUTE(单元格,UNICHAR(160)," ")


2.导入到Access临时表以后,然后使用SQL语句替换

Replace(字段名称, ChrW(160), " ")



Access软件网官方交流QQ群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助