加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

MDB链接SQLSERVER导致写入冲突

发布时间:2020-12-12 15:46:45 所属栏目:MsSql教程 来源:网络整理
导读:MDB链接SQLSERVER导致写入冲突 作者:cg1??摘自: access911.net ?? 编 辑 :cg1??更新日期:2008-9-21??浏览人次: 45 专题地址: http://www.access911.net/?kbid;72FABF1E13DCE8F3 ? 简述: ? 阅读前需掌握: ? 难度等级: 10 ? ? 问题: 今天遇到一个很

专题地址:

http://www.access911.net/?kbid;72FABF1E13DCE8F3

?

简述:

?

阅读前需掌握:

?

难度等级:

10



?

?

问题:

今天遇到一个很有趣的问题,在帮别人解决问题时遇到的
有人用链接表的方式操作后台数据库,当后台数据库是?MDB?是,没出现什么问题,但是当链接的数据库是?SQL?SERVER时新增记录后进行修改时就一直出现写入冲突的错误提示,且“保存记录”按钮永远是灰色的。

完整提示为:

写入冲突
从您开始编辑此记录以来,该记录已被另一用户更改。如果现在
保存记录,将会覆盖其他用户所做的更改。

将更改内容复制到剪贴板上可以让您看到其他用户输入的值,当
您决定要修改时,可再将剪贴板上的更改内容粘贴回来。

[保存记录(S)]?[复制到剪贴板(C)]?[放弃更改(D)]

图片如下:

而且只要用?ACCESS?界面修改就会永远有这个提示,永远无法解决。
表的结构为


/******?Object:??Table?[dbo].[cg_LimitDetail]????Script?Date:?2008-9-21?19:59:34?******/
if?exists?(select?*?from?dbo.sysobjects?where?id?=?object_id(N'[dbo].[cg_LimitDetail]')?and?OBJECTPROPERTY(id,?N'IsUserTable')?=?1)
drop?table?[dbo].[cg_LimitDetail]
GO

/******?Object:??Table?[dbo].[cg_LimitDetail]????Script?Date:?2008-9-21?19:59:34?******/
CREATE?TABLE?[dbo].[cg_LimitDetail]?(
????[id]?[int]?IDENTITY?(1,?1)?NOT?NULL?,
????[LimitGroupId]?[int]?NULL?,
????[LimitConst]?[nvarchar]?(50)?COLLATE?Chinese_PRC_CI_AS?NULL?,
????[LimitValue]?[bit]?NULL?
)?ON?[PRIMARY]
GO

ALTER?TABLE?[dbo].[cg_LimitDetail]?WITH?NOCHECK?ADD?
????CONSTRAINT?[PK_cg_LimitDetail]?PRIMARY?KEY??CLUSTERED?
????(
????????[id]
????)??ON?[PRIMARY]?
GO


后来又发现了如果在?SQL?SERVER?中定义字段为“货币”,然后随便输入一些值,在?ODBC?链接到?ACCESS?以后也无法正常显示。软件版本为?WINDOWS?2003?SP2?英文版+SQL?SERVER?2000?英文版+ACCESS?2003简体中文版

?

回答:

一开始百思不得其解,但是仔细一看发现,其中一个字段是?bit(SQL?Server)?也就是?ACCESS?的?Yes/No。这个数据类型在?ACCESS?与?SQL?SERVER?中是不一样的。ACCESS?中?TRUE?是?-1?,而?SQL?SERVER?中?TRUE?是1,需要转换的。问题就出在这里,我实际在修改字段时并没有指定值,但是?ACCESS?自动将其设置为?0?,也就是?FALSE?。但是用?SQL?SERVER?事件探查器查出来可就不同了:

exec?sp_executesql?N'UPDATE?"dbo"."cg_LimitDetail"?SET?"LimitConst"=@P1??WHERE?"id"?=?@P2?AND?"LimitGroupId"?=?@P3?AND?"LimitConst"?IS?NULL?AND?"LimitValue"?=?@P4',?N'@P1?nvarchar(50),@P2?int,@P3?int,@P4?bit',?N'33',?3,?2,?0

大家看到,最后一个参数?@P4?竟然是?0?,但是实际上在?SQL?SERVER?中是?Null?。

终于找到问题了,要解决这个问题可以直接在?SQL?SERVER?设计表时直接指定?BIT?字段的默认值为?0。
ACCESS中与SQL?SERVER中数据类型不同,有些数据类型在链接表时ACCESS无法自动识别进行转换,也不提示有用的错误信息,所以应该算是个BUG吧。在这种环境下尽量使用不要转换的数据类型,比如长整、双精度之类的数据类型。

微软MVP?huanghai先生在直接用ADO绑定窗体数据源时也遇到上述问题,且即使定义默认值也无法解决,最终解决方案是使用长整。

?


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。如需转载必须征得作者同意并注明本站链接

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

MDB链接SQLSERVER导致写入冲突

作者:cg1??摘自:access911.net??:cg1??更新日期:2008-9-21??浏览人次: 45

    推荐文章
      热点阅读