微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WinForm+Access主从表绑定修改主表数据出错(而Sqlserver不会)

        各位好,我用 C# WinForm+Access 做单据式的界面,绑定主从表时子表操作都没问题,但一修改主表,再保存就出错,提示[由于表 'BillDetail' 中了包含相关记录,不能删除或改变该记录。]。其实我并没修改主表的主键或其他有关联的数据,只是修改了一些备注的文字信息也是如此,不知何故?
        我尝试换成sqlServer数据库,结构都一样,却没有此问题,不知何故?
        千万别告诉我,将关系删除,我相信是有关系的问题,但不是关系的错。

 

图一:Access数据库结构:

 

图二:sqlserver数据库结构

 

图三:WinForm界面与控件

 

以下是sqlSever的建库脚本,Access的结构也一样,WinForm中基本没什么自己写的代码,都是生成的。

 

  1. if exists (select * from sysobjects where id = OBJECT_ID('[Products]') and OBJECTPROPERTY(id, 
  2. 'IsUserTable') = 1) 
  3. DROP TABLE [Products]
  4. GO
  5. CREATE TABLE [Products] (
  6.     [Pkid] [int] IDENTITY (1, 1) NOT NULL ,
  7.     [ProductCode] [char] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,
  8.     [ProductName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
  9.     CONSTRAINT [PK_Products] PRIMARY KEY  CLUSTERED 
  10.     (
  11.         [Pkid]
  12.     )  ON [PRIMARY] 
  13. ) ON [PRIMARY]
  14. GO
  15. SET IDENTITY_INSERT [Products] ON
  16. INSERT [Products] ([Pkid],[ProductCode],[ProductName]) VALUES ( 2,'F0501200','绿茶洗发水')
  17. INSERT [Products] ([Pkid],[ProductName]) VALUES ( 3,'M0602600','香草沐浴露')
  18. INSERT [Products] ([Pkid],[ProductName]) VALUES ( 4,'C0518500','芦荟洗手液')
  19. SET IDENTITY_INSERT [Products] OFF
  20. GO
  21. --------------------
  22. if exists (select * from sysobjects where id = OBJECT_ID('[Bill]') and OBJECTPROPERTY(id, 
  23. 'IsUserTable') = 1) 
  24. DROP TABLE [Bill]
  25. GO
  26. CREATE TABLE [Bill] (
  27.     [Guid] [uniqueidentifier] NOT NULL ,
  28.     [BillDateTime] [datetime] NOT NULL ,
  29.     [Person] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
  30.     CONSTRAINT [PK_Bill] PRIMARY KEY  CLUSTERED 
  31.     (
  32.         [Guid]
  33.     )  ON [PRIMARY] 
  34. ) ON [PRIMARY]
  35. GO
  36. INSERT [Bill] ([Guid],[BillDateTime],[Person]) VALUES ( 'b0caaa95-339c-4de7-b1ad-
  37. 1b0fadf78103','2008-12-02 23:55:00','唐古拉山')
  38. INSERT [Bill] ([Guid],[Person]) VALUES ( '23704e6a-eca6-4622-9fe1-
  39. caa7a3aa8eca','2007-09-24 8:23:00','李飞')
  40. GO
  41. --------------------
  42. if exists (select * from sysobjects where id = OBJECT_ID('[BillDetail]') and OBJECTPROPERTY(id, 
  43. 'IsUserTable') = 1) 
  44. DROP TABLE [BillDetail]
  45. GO
  46. CREATE TABLE [BillDetail] (
  47.     [Guid] [uniqueidentifier] NOT NULL ,
  48.     [LineNum] [int] NOT NULL ,
  49.     [ProductId] [int] NOT NULL ,
  50.     [Quantity] [decimal](18, 4) NOT NULL ,
  51.     [Price] [decimal](18,
  52.     [Remark] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
  53.     CONSTRAINT [PK_BillDetail] PRIMARY KEY  CLUSTERED 
  54.     (
  55.         [Guid],
  56.         [LineNum]
  57.     )  ON [PRIMARY] ,
  58.     CONSTRAINT [FK_BillDetail_Bill] FOREIGN KEY 
  59.     (
  60.         [Guid]
  61.     ) REFERENCES [Bill] (
  62.         [Guid]
  63.     ),
  64.     CONSTRAINT [FK_BillDetail_Products] FOREIGN KEY 
  65.     (
  66.         [ProductId]
  67.     ) REFERENCES [Products] (
  68.         [Pkid]
  69.     )
  70. ) ON [PRIMARY]
  71. GO
  72. INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price],[Remark]) VALUES ( 
  73. 'b0caaa95-339c-4de7-b1ad-1b0fadf78103',1,2,23.5000,66.5800,'单独发货')
  74. INSERT [BillDetail] ([Guid],[Price]) VALUES ( 'b0caaa95-339c-
  75. 4de7-b1ad-1b0fadf78103',3,33.5000,45.5800)
  76. INSERT [BillDetail] ([Guid],[Price]) VALUES ( 'b0caaa95-339c-
  77. 4de7-b1ad-1b0fadf78103',4,24.0000,50.0000)
  78. INSERT [BillDetail] ([Guid],[Price]) VALUES ( '23704e6a-eca6-
  79. 4622-9fe1-caa7a3aa8eca',44.0000,345.0000)
  80. INSERT [BillDetail] ([Guid],[Remark]) VALUES ( 
  81. '23704e6a-eca6-4622-9fe1-caa7a3aa8eca',52.0000,56.7800,'补货')
  82. INSERT [BillDetail] ([Guid],66.8000)
  83. GO

呵呵,自己解决了。

观察了“TableAdapter”的“UpdateCommand”的sql语句,哇,一大把:

  1. UPDATE Bill
  2. SET [Guid] = ?, BillDateTime = ?, Person = ?
  3. WHERE ([Guid] = ?) AND (? = 1) AND (BillDateTime IS NULL) AND (? = 1) AND 
  4.       (Person IS NULL) OR
  5.       ([Guid] = ?) AND (BillDateTime = ?) AND (? = 1) AND (Person IS NULL) OR
  6.       ([Guid] = ?) AND (? = 1) AND (BillDateTime IS NULL) AND (Person = ?) OR
  7.       ([Guid] = ?) AND (BillDateTime = ?) AND (Person = ?)

去除它的“使用开放式并发”后:

  1. UPDATE Bill
  2. SET [Guid] = ?, Person = ?
  3. WHERE ([Guid] = ?)

现在好看了……哇!为何要Update Guid字段,它是主键,不会变的!好,改掉它的!

  1. UPDATE Bill
  2. SET BillDateTime = ?, Person = ?
  3. WHERE ([Guid] = ?)

 

现在没问题了罗。

 

心得:

(1)、微软的IDE是方便快捷,但在没明白它都给你干了些啥之前,最好别用它。

(2)、搞不懂MS ACCESS,Update 自己=自己这样的语句也是导致了修改事件?而sql Server则不会。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐