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],[ProductCode],[ProductName]) VALUES ( 3,'M0602600','香草沐浴露')
  18. INSERT [Products] ([Pkid],[ProductCode],[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],[BillDateTime],[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, 4) NOT NULL ,
  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],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( 'b0caaa95-339c-
  75. 4de7-b1ad-1b0fadf78103',2,3,33.5000,45.5800)
  76. INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( 'b0caaa95-339c-
  77. 4de7-b1ad-1b0fadf78103',3,4,24.0000,50.0000)
  78. INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( '23704e6a-eca6-
  79. 4622-9fe1-caa7a3aa8eca',1,4,44.0000,345.0000)
  80. INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price],[Remark]) VALUES ( 
  81. '23704e6a-eca6-4622-9fe1-caa7a3aa8eca',2,3,52.0000,56.7800,'补货')
  82. INSERT [BillDetail] ([Guid],[LineNum],[ProductId],[Quantity],[Price]) VALUES ( '23704e6a-eca6-
  83. 4622-9fe1-caa7a3aa8eca',3,2,23.5000,66.8000)
  84. 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] = ?, BillDateTime = ?, Person = ?
  3. WHERE ([Guid] = ?)

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

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

 

现在没问题了罗。

 

心得:

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

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

 

转载于:https://www.cnblogs.com/TangZhongxin/archive/2008/12/11/3942686.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值