加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 15:44:38 所属栏目:MsSql教程 来源:网络整理
导读:??????? 各位好,我用 C# WinForm+Access 做单据式的界面,绑定主从表时子表操作都没问题,但一修改主表,再保存就出错,提示[由于表 'BillDetail' 中了包含相关记录,不能删除或改变该记录。]。其实我并没修改主表的主键或其他有关联的数据,只是修改了一些

??????? 各位好,我用 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则不会。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读