Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> ADP  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701946
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

MDB链接SQLSERVER导致写入冲突

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

 

问题:

今天遇到一个很有趣的问题,在帮别人解决问题时遇到的
有人用链接表的方式操作后台数据库,当后台数据库是 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简体中文版

 

回答:


Access 兼容性问题,将bit类型改为interger(长整)即可

一开始百思不得其解,但是仔细一看发现,其中一个字段是 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 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利