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, 陳格 保留所有權利