

ACCESS数据库
MDB链接SQLSERVER导致写入冲突
2008-11-25 09:40:28
一开始百思不得其解,但是仔细一看发现,其中一个字段是 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绑定窗体数据源时也遇到上述问题,且即使定义默认值也无法解决,最终解决方案是使用长整